Углеродное понятноеextEvent и вторичные потоки
-
28-09-2019 - |
Вопрос
Представьте себе трансплатформенную библиотеку, которая должна создать собственные окна, не полагаясь на WinForms / GTK # / WPF / Monomac / etc (это Opentk. В случае, если кто-то интересен).
Вот сделка: Windows и X11, способные поддержать Unices (или могут работать с) несколькими контурами события, по одному на каждом потоке. Это означает (а) Вы можете создать одно окно на поток и иметь их работать независимо и (b) вы можете запустить окно WinForms (или GTK #, WPF, ...) на одном потоке и открыть окно OpenTK на другой, Без вмешательства.
Теперь, чтобы лучшее из моего - по общему признанию ограничено - знания, углерод не поддерживает это. События ОС поставляются только на цикл «Основную» контуру событий, и все вторичные потоки, работающие на FUMES (то есть ChitiverextEvent всегда возвращает EventLooptimedOuterR и не найдут никаких событий). Сам Opentk может работать с этим ограничением, без проблем, но это представляет интересную проблему для приложений, которые пытаются смешать Opentk с другим инструментом для инструментария (например, Monomac), чтобы представить окно конфигурации.
Два варианта:
- Отказаться от идеи как сумасшедший и запретить смешивание Opentk с различными инструментариями (плохо).
- Выберите боевой топор и взломать углерод в представление (хорошо).
Вот вы пришли: Можете ли вы подумать о каком-либо способе сделать эту работу? Представьте себе следующий сценарий:
- Тема № 1 (Main) запускает некоторый код инициализации нашего собственного выбора и порождает второй поток (мы можем модифицировать это свободно).
- Нить № 1 (Main) открывает нативное окно и запускает петлю RAEL (RunApplicationEventLoop). Он выходит из нашего прямого контроля, хотя мы все еще можем установить таймеры для запуска нашего кода, если это необходимо.
- Нить № 2 (вторичный) открывает окно Opentk, которое быстро зависает (события доставляются только в Threate # 1, и в этом нет.
Можно ли фильтровать события из потока № 1 и доставлять их в тему № 2 по мере необходимости? Может ли CF как-то помочь здесь? Gurus Mac OS X, пожалуйста, помогите!
(Язык программирования не имеет значения, используйте все, что вы знакомы. Я предпочитаю решение на основе углерода, но какао будет работать просто хорошо.)
Решение
Передача событий из одного потока на другую должно работать, насколько просто прообразует доставляемые события. Липкая часть состоит в том, что многие API, связанные с пользовательскими интерфейсами, не являются безопасными потоками, хотя основной обработкой углеродных событий является. Все, что включает в себя обновление элементов управления и рисунок, вероятно, следует обрабатывать обратно на главную нить. Это потребовало бы много заднего и назад, и не стоит того, чтобы попытаться сделать это работать.
Другие советы
Взгляни на Application.addmessageFilter. и то ImessageFilter. интерфейс. Ты мощь быть в состоянии перехватить и пересылать сообщения, используя пользовательскую логику. Я использовал эту технику в прошлом (очень далекое прошлое), но это было так давно, что я не помню всех предупреждений, которые идут вместе с ним. Я даже не уверен, что фильтр сообщений получит все сообщения. .Net может не отфильтровывать их за кулисами, прежде чем отправлять их в IMessageFilter
, но стоит выстрел.