В чем реальная польза от запуска цикла? - PullRequest
3 голосов
/ 21 октября 2009

Читая яблочные документы о многопоточности, они много говорят о Run Loops. Какой смысл создавать Run Loop? Это для повторного использования пользовательского потока несколько раз? В каких примерных ситуациях Run Loop является хорошей идеей?

Как этот цикл выполнения относится к потоку? Возьмем в качестве примера основной цикл запуска приложения для iPhone OS. Когда пользователь касается экрана, он запускает событие. Повторяет ли цикл выполнения основной поток, чтобы обработать событие с некоторым кодом? Или цикл выполнения создает новый поток каждый раз, когда происходит событие?

Ответы [ 3 ]

7 голосов
/ 21 октября 2009

Выполнение циклов - хорошая идея, если вы хотите, чтобы ваше приложение работало с современным пользовательским интерфейсом на основе событий. Т.е. что-нибудь со времен ДОС.

Все среды выполнения настольных ОС от Какао до .NET до REAL, основанные на том, что дают вам основной цикл запуска бесплатно. Цикл выполнения идет по кругу, проверяя события и доставляя их туда, куда им нужно идти. Без него вы бы не получили мышь, клавиатуру или другие системные события. Когда завершается основной цикл выполнения, ваше приложение также автоматически прекращает работу.

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

Основной поток в приложении iPhone или Cocoa запускает основной цикл выполнения, и все события доставляются в основной поток. Любые дополнительные потоки, которые вы создаете, не имеют собственного цикла выполнения, если вы не создаете его самостоятельно.

3 голосов
/ 21 октября 2009

Цикл выполнения - это основная конструкция, поддерживающая работу вашего приложения.

Приложение перебирает цикл выполнения, управляя событиями, таймерами и т. Д. До тех пор, пока приложение не закроется.

Цикл выполнения концептуально представляет собой бесконечный цикл:

while( !quit ) {
    // Handle events
    // Listen for input
    // Manage timers
    // ...

}

Если вы не создаете дополнительные потоки, вам не нужно явно создавать объекты цикла выполнения. Поток может иметь свой собственный цикл выполнения, в котором он может независимо управлять своими событиями, таймерами и обрабатывать ввод.

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

Ознакомьтесь с документацией Apple по адресу developer.apple.com .

1 голос
/ 21 октября 2009

Я был ужасно смущен и в Runloops. Они работают больше как очередь событий или центр уведомлений, чем что-либо связанное с циклом. Поскольку они называются циклами, я склонен думать о потоках или о потоке в цикле. Существует поток, который выполняет работу, которая добавляется в цикл выполнения и отличается от фактического цикла. Точно так же, как iKenndac говорит, что вам нужно понять концепцию, если вы хотите написать код для любого современного пользовательского интерфейса, который более продвинут, чем DOS. Все, от Swing до SWT, от J2ME до Blackberry и iPhone, включает эту концепцию. Они просто названы по-разному. Вот запутанная вещь. Вы можете создавать новые RunLoops и добавлять вещи к ним. Добавленный материал будет бездействовать без дела, фактически никогда не работая, потому что вам нужно создать реальный поток для прокачки RunLoop. Я замолчу здесь, потому что я все еще изучаю CocoaTouch и SDK, и я не хочу путать дальше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...