Как создать цикл запуска, который запускается только при вызове метода executeSelector ...? - PullRequest
5 голосов
/ 23 октября 2009

Я немного возиться с темами. Теперь рассмотрим это: У меня есть основная тема. Я начинаю новую тему. В этом методе точки входа я хочу сделать цикл выполнения. Теперь документация говорит мне, что у меня должен быть источник ввода. В противном случае мой цикл запуска завершается немедленно. плохой. Хорошо. но у меня нет другого источника ввода, кроме моего метода executeSelector .... После запуска потока появляется метод executeSelector, который через некоторое время запускает другой метод в этом потоке. внутри этого метода происходит другой вызов executeSelector и т. д. каждая с задержкой от 0,1 до 1 сек. Так что многократный таймер стрельбы бессмыслен, верно; -)

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

Любые предложения, кто-нибудь?

Ответы [ 2 ]

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

Код, который вам нужен, поясняется на рис. 3-14 в Run Loops в Руководстве по программированию потоков. Но это так хорошо скрыто в других дискуссиях, что, если вы не поймете всего остального на этой странице, вы не совсем поймете, на что смотрите. Прочтите этот раздел, и, надеюсь, этот код будет иметь смысл:

- (void)startRunLoop:(id)sender
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    // Any thread setup

    do
    {
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
                                 beforeDate:[NSDate distantFuture]];
    } while (self.isStarted);

    // Any thread cleanup

    [pool release];
}
0 голосов
/ 25 октября 2009

Вы не описываете то, что ДЕЙСТВИТЕЛЬНО пытаетесь сделать, поэтому трудно сказать, но, похоже, вы немного усложняете вещи.

Я считаю, что вы хотите иметь только один поток (запускаемый любым способом, каким вам нравится), и этот поток должен использовать NSCondition / NSLock для сна, пока вы не захотите, чтобы он проснулся.

См. это С.О. нить за похожий вопрос и хороший ответ, объясняющий, как это сделать:

...