У меня проблема с GUI / многопоточностью в Mac OS X (10.6.7).Я использую фреймворк wxWidgets (версия 2.9.1), и он опирается на Какао в моем случае.Дизайн приложения выглядит следующим образом:
- thread # 1 (он же «Основной поток»): входит в main (), анализирует переключатели и, если необходимо, запускает другой поток (используя примитивы POSIX).
- thread # 2 (он же «поток GUI»): использует wxEntry для инициализации wxWidgets и отображения GUI.
Как и большинство других сред GUI, Cocoa не является поточно-ориентированным,поэтому мы обязательно выполняем все вызовы GUI из потока № 2, передавая сообщения при необходимости.Тем не менее, в этом конкретном случае утверждение возникает изнутри внутренних компонентов Cocoa во время инициализации (точнее, из NSUndoManager), говоря, по сути, «использование меня вне основного потока небезопасно».Даже если поток № 2 является основным потоком в отношении всего, что связано с GUI.
Что ж, NSUndoManager должен иметь способ узнать, что он запускается из основного потока (возможно,используя NSThread :: isMainThread ()).Так что мой вопрос: можно ли обмануть NSUndoManager (и вообще Какао) по этому поводу?И даже лучше, объявить поток № 2 «Основным потоком» , а поток № 1 станет вторичным?По сути, мне нужен вызов API, такой как «сделать вызывающий поток основным».Недокументированное волшебство и Objective C ++ хороши, если они работают и в OS X 10.5.
PP код, как и сейчас, работает безупречно под Windows / Linux / MacOSX + Carbon.Кроме того, перепроектировать его, чтобы изменить структуру потока, было бы огромной болью.