2010-01-13 7 views
5

В окнах каждый поток имеет очередь сообщений, и каждая очередь сообщений обрабатывает сообщения для окон, принадлежащих этому потоку. Это означает, что написать приложение, в котором вы можете создать поток, с контуром сообщения и одним (или более) окном, достаточно просто. Игнорируя любые проблемы с приложениями, теперь у вас есть окна приложений, которые будут продолжать взаимодействовать с пользователем, даже если одно из других окон занято какой-то модальной операцией.Какао, окна и нитки?

Теперь, портируя приложение на какао, я столкнулся, ну, Интерфейс Builder. Это неожиданность для тех, кто ожидает больше контроля над созданием окон и построением конвейера сообщений. Тем не менее я вижу, откуда ИБ.

Моя проблема, однако, заключается в непрозрачном функционале NSApplicationMain(). Это - в главном потоке приложений автоматически создает главное окно приложений и запускает насос сообщений, все данные управляются из файлов NIB.

Однако это оставляет мне проблему: даже если я покупаю идею о том, что Interface Builder - это способ сделать мое главное окно приложения - и я вычислил достаточно объектив C для создания подкадров на лету - а также как создавать потоки - я могу посмотреть, как создать насос сообщений в рабочих потоках. Я начинаю сомневаться в его возможности.

У окон в какао даже есть сходство нитей, которые они делают в Win32? то есть каждый поток имеет свой собственный цикл диспетчеризации сообщений для окон, принадлежащих этому потоку? Я начинаю подозревать, что, возможно, Cocoa ожидает, что все мои окна будут «принадлежать» основному потоку, и я просто получу смещение работы (и рисования) на другие потоки.

Любые подсказки относительно того, как лучше всего перевести приложение Win32 с несколькими окнами на строку для парадигм Cocoa?

ответ

9

Интерфейс Builder - это красная селедка в этой дискуссии. Реальный вопрос заключается в ориентированном на дизайн модели какао и эти двух пунктов из вашего вопроса являются ключевыми:

Однако, это оставляет меня с проблемы: Даже если я покупаю в идею , что Interface Builder является способ пойти сделать мое главное окно приложения - и я понял, достаточно объективную C создавать вложенные окна на лету - в также как создавать темы - Я можно видеть, как создать сообщение насос в рабочие потоки. Я начинаю сомневаться в возможном .

У окна в какао даже есть вид сродства резьбы, которое они делают В Win32? т. Е. Каждый поток имеет свое собственное сообщение диспетчерский контур для окон, принадлежащих , что поток? Im начинает подозревать , что, возможно, Cocoa ожидает, что все мои окна будут «принадлежать» основной нитью, и я просто получаю смещение работы (и рисунка) на другие темы.

Короче говоря, нет, это не работает. Cocoa имеет совершенно другую модель обработки событий и совершенно другой набор инструментов для поддержки параллелизма.

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

Это другое дело и пытается сгибать его, чтобы работать как нить за окно с насосом - это путь крайней боли. Не спускайся.

Теперь, какао делает имеет петли на резьбу. Но они не используются для обработки пользовательских событий.

Короче говоря, вам нужно будет вернуться к архитектуре приложения, чтобы перевести код на Cocoa. Прямой порт невозможен.

+1

tl; dr версия: «Cocoa - это однопоточный набор инструментов пользовательского интерфейса, такой как WPF, работает над другими потоками» –

+1

Симпатичный, но неправильный. Какао на самом деле имеет кучу поддержки многопоточности, включая многопоточный чертеж. То, что он не делает, - это иметь несколько потоков, обрабатывающих события независимо (потому что, в основном, это не имеет смысла). – bbum

+0

@bbum вот что я имел в виду, что, если вы не нажмете его, у Cocoa будет 1 цикл событий для обработки пользовательских интерфейсов. Мой tl; dr; версия была не так хорошо объяснена, но я старался держать ее в курсе :) –

Смежные вопросы