Вопрос

Представьте себе трансплатформенную библиотеку, которая должна создать собственные окна, не полагаясь на WinForms / GTK # / WPF / Monomac / etc (это Opentk. В случае, если кто-то интересен).

Вот сделка: Windows и X11, способные поддержать Unices (или могут работать с) несколькими контурами события, по одному на каждом потоке. Это означает (а) Вы можете создать одно окно на поток и иметь их работать независимо и (b) вы можете запустить окно WinForms (или GTK #, WPF, ...) на одном потоке и открыть окно OpenTK на другой, Без вмешательства.

Теперь, чтобы лучшее из моего - по общему признанию ограничено - знания, углерод не поддерживает это. События ОС поставляются только на цикл «Основную» контуру событий, и все вторичные потоки, работающие на FUMES (то есть ChitiverextEvent всегда возвращает EventLooptimedOuterR и не найдут никаких событий). Сам Opentk может работать с этим ограничением, без проблем, но это представляет интересную проблему для приложений, которые пытаются смешать Opentk с другим инструментом для инструментария (например, Monomac), чтобы представить окно конфигурации.

Два варианта:

  • Отказаться от идеи как сумасшедший и запретить смешивание Opentk с различными инструментариями (плохо).
  • Выберите боевой топор и взломать углерод в представление (хорошо).

Вот вы пришли: Можете ли вы подумать о каком-либо способе сделать эту работу? Представьте себе следующий сценарий:

  1. Тема № 1 (Main) запускает некоторый код инициализации нашего собственного выбора и порождает второй поток (мы можем модифицировать это свободно).
  2. Нить № 1 (Main) открывает нативное окно и запускает петлю RAEL (RunApplicationEventLoop). Он выходит из нашего прямого контроля, хотя мы все еще можем установить таймеры для запуска нашего кода, если это необходимо.
  3. Нить № 2 (вторичный) открывает окно Opentk, которое быстро зависает (события доставляются только в Threate # 1, и в этом нет.

Можно ли фильтровать события из потока № 1 и доставлять их в тему № 2 по мере необходимости? Может ли CF как-то помочь здесь? Gurus Mac OS X, пожалуйста, помогите!

(Язык программирования не имеет значения, используйте все, что вы знакомы. Я предпочитаю решение на основе углерода, но какао будет работать просто хорошо.)

Это было полезно?

Решение

Передача событий из одного потока на другую должно работать, насколько просто прообразует доставляемые события. Липкая часть состоит в том, что многие API, связанные с пользовательскими интерфейсами, не являются безопасными потоками, хотя основной обработкой углеродных событий является. Все, что включает в себя обновление элементов управления и рисунок, вероятно, следует обрабатывать обратно на главную нить. Это потребовало бы много заднего и назад, и не стоит того, чтобы попытаться сделать это работать.

Другие советы

Взгляни на Application.addmessageFilter. и то ImessageFilter. интерфейс. Ты мощь быть в состоянии перехватить и пересылать сообщения, используя пользовательскую логику. Я использовал эту технику в прошлом (очень далекое прошлое), но это было так давно, что я не помню всех предупреждений, которые идут вместе с ним. Я даже не уверен, что фильтр сообщений получит все сообщения. .Net может не отфильтровывать их за кулисами, прежде чем отправлять их в IMessageFilter, но стоит выстрел.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top