Что именно здесь называется «Run Loop»? - PullRequest
2 голосов
/ 22 октября 2009

Прежде чем продолжить чтение документов, мой мозг застрял в этой точке:

- (void)threadMainRoutine {
    BOOL moreWorkToDo = YES;
    BOOL exitNow = NO;

    NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; // is this THE run loop?

    // some stuff...

    while (moreWorkToDo && !exitNow) { // or is THIS the run loop?
        // some stuff

        [runLoop runUntilDate:[NSDate date]];

        // some stuff
    }

    // some stuff
}

Я добавил несколько комментариев в пример кода. Может быть, кто-то может объяснить это, почему есть цикл while, если есть объект runLoop, который получает сообщение -runUntilDate :. Я имею в виду: кто здесь? Я вижу два. Сначала это, очевидно, работающий цикл, а затем он вызывает метод, который звучит как запуск цикла.

stateConfused = YES;
pleaseExplain = YES;

Ответы [ 3 ]

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

Технически, NSRunLoop зацикливается внутри (это происходит до даты). Это дает вам периодическую возможность выйти из потока - если вы используете run вместо runUntilDate:, тогда NSRunLoop будет внутренне зацикливаться (вам не нужно будет оборачивать его в цикле while, но вы никогда не сможете остановиться это тоже). Это нормальное поведение для основного потока, а не рабочих потоков, которые обычно имеют условия выхода, которые требуют периодической проверки.

runLoop никогда не изменит значение moreWorkToDo или exitNow (вы несете ответственность за это, когда работа потока завершена или пользователь вышел из вашего приложения), но именно так вы решите, хотите ли вы поток для завершения.

В зависимости от того, как вы хотите, чтобы ваш поток работал, вы можете заменить эти флаги на [NSApp isRunning] и [tasksRemainingForThisThreadToProcess count] != 0 или аналогичные.

(Предупреждение о состоянии гонки: если вы завершаете поток, когда все оставшиеся задачи обрабатываются, будьте осторожны, чтобы никогда не отправлять в него другую задачу, когда tasksRemainingForThisThreadToProcess пуст, поскольку это указывает на то, что поток завершит работу).

0 голосов
/ 23 октября 2009

первый фактический цикл выполнения, цикл выполнения, возвращаемый [NSRunLoop currentRunLoop], создается приложением UIA. Упрощенно, он получает все события ОС (клавиатура, мышь и т. Д.) И отправляет их в вашу программу. Если вы позвоните [runLoop runUntilDate:[NSDate date]];, он вернется после истечения указанной даты, но ваша программа продолжит получать события ОС. Смотрите эту ссылку .

Это отличается от звонка:

[[NSThread currentThread] sleepFormTimeInterval:]

, который отправит ваш поток в спящий режим полностью, и он даже не получит события ОС.

0 голосов
/ 22 октября 2009

Один - это объект, отвечающий за поддержание состояния цикла выполнения, другой - фактический цикл.

...