Mac OS X: возможно ли наполнить неосновную нить, чтобы стать «основной нитью» процесса? - PullRequest
12 голосов
/ 30 мая 2011

У меня проблема с 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.Кроме того, перепроектировать его, чтобы изменить структуру потока, было бы огромной болью.

1 Ответ

0 голосов
/ 31 мая 2011

ОК, так что согласно вашему комментарию: вы в основном не избежите рефакторинга вашего кода.Большинство систем с графическим интерфейсом используют основной поток и обрабатывают циклы событий для себя.Но если вы скажете, что GUI является необязательным, возможно, лучше разделить ваше приложение на два - рабочий и GUI.Графический интерфейс может общаться с работником различными способами, в зависимости от платформы / конкретных потребностей.

...