Представьте себе кроссплатформенную библиотеку, которая должна создавать свои собственные окна, не полагаясь на WinForms / GTK # / WPF / MonoMac / и т. Д. (Это OpenTK на случай, если кому-то это интересно).
Вот в чем дело: Unices с поддержкой Windows и X11 поддерживает (или может работать с) несколько циклов событий, по одному на каждый поток. Это означает, что (а) вы можете создать одно окно для каждого потока и заставить их работать независимо, и (б) вы можете запустить окно WinForms (или GTK #, WPF, ...) в одном потоке и открыть окно OpenTK в другом, без помех.
Теперь, насколько мне известно, по общему признанию, Carbon не поддерживает это. События ОС доставляются только в «основной» цикл событий, и все вторичные потоки работают на парах (то есть ReceiveNextEvent всегда возвращает eventLoopTimedOutErr и не находит никаких событий). Сам OpenTK может работать с этим ограничением, без проблем, но это представляет интересную проблему для приложений, которые пытаются смешать OpenTK с другим набором инструментов (например, MonoMac) для представления окна конфигурации.
Два варианта:
- отказаться от идеи как сумасшедшей и запретить смешивать OpenTK с различными наборами инструментов (плохо).
- выбрать боевой топор и взломать Углерод в подчинение (хорошо).
Вот, куда вы пришли: можете ли вы придумать, как сделать эту работу? Представьте себе следующий сценарий:
- Поток # 1 (основной) запускает некоторый код инициализации по нашему выбору и порождает второй поток (мы можем изменить его свободно).
- Поток # 1 (основной) открывает собственное окно и запускает цикл RAEL (RunApplicationEventLoop). Это выходит из-под нашего прямого контроля, хотя мы все равно можем установить таймеры для запуска нашего кода, если это необходимо.
- Поток № 2 (вторичный) открывает окно OpenTK, которое быстро зависает (события доставляются только в поток № 1, а ReceiveNextEvent ничего не получает).
Можно ли отфильтровать события из потока № 1 и доставить их в поток № 2 при необходимости? Может ли CF как-то помочь здесь? Гуру Mac OS X, пожалуйста, помогите!
(Язык программирования не имеет значения, используйте все, с чем вы знакомы. Я бы предпочел решение на основе углерода, но Cocoa будет работать просто отлично.)