2012-01-11 2 views
2

В Mac OS X какао управляется событиями. Под этим я подразумеваю, что каждая вещь управляется пользовательским интерфейсом - пользователь, нажимая что-то или перемещаясь по определенной области, приводит к вызову обработчика события. Main просто вызывает NSApplicationMain(), который создает бесконечный цикл до выхода программы.Cocoa Event Driven System: где выполняются фоновые задачи?

Как насчет задач, которые не управляются пользователем? Где бы я поставил задачи, которые должны работать в фоновом режиме, чтобы обеспечить базовую функциональность программы? Например, Photo Booth выполняет определенные действия, когда пользователь взаимодействует с пользовательским интерфейсом (т. Е. Переключается на видео камеру при нажатии на определенную кнопку). Тем не менее, Photo Booth также непрерывно извлекает кадры из камеры для обеспечения видеопотока.

Так что мой вопрос в том, куда идти код не-пользовательского интерфейса? Main() на самом деле не является возможностью, так как мне нужны задачи для запуска в течение всей жизни программы, а не когда программа только начинается.

Я нахожусь в Mac OS X Snow Leopard (я хочу что-то, что работает на всех Mac Systems, хотя: например, Lion OS X), и я использую приложение Obj-C Cocoa в Xcode.

ответ

8

Любое приложение на основе какао имеет доступ к использованию RunLoops.

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

Я рекомендую прочитать информацию от Apple Thread Programming Guide для получения дополнительной информации.

С Grand Central Dispatch модели программирования изменились, чтобы использовать современные многоядерные системы, поэтому можно определить задачу и управлять ОС ее исполнением.

+0

Спасибо, резьбы звучат идеально. Мне нужно централизованное место, чтобы объявлять все переменные и запускать потоки. Где бы я это сделал? – fdh

+1

В конце концов, ваша задача всегда будет работать в ответ на что-то (даже если это что-то значит «время прохождения» или «приложение запущено»). Что-то вроде вашего примера Photo Booth, оно будет работать в ответ на обратные вызовы из библиотеки видеозахвата. В случае сетевого приложения он будет работать в ответ на входящие пакеты в сети. «Событие управляется» относится не только к событиям GUI. –

+0

Если я хочу, чтобы это было «управляемо» при запуске приложения, я бы поставил его в главном, как в консольных приложениях? – fdh