Как приостановить NSThread до уведомления?

У меня есть рабочий поток, который я хочу выполнить один бит своей задачи, затем приостановить и подождать команду «ок, продолжить» из другого потока, затем приостановить и подождать и т. Д.

Вариант использования: управляющий объект - это представление, в котором я хочу отобразить информацию о том, что происходит внутри рабочего потока, и разрешить мне «пошагово» пройти по рабочему, как он это делает.

Довольно уродливая и грубая вещь, которую я имею в своем работнике, такова:

NSLog(@"paused");
paused = YES;

while (paused)
{
    [NSThread sleepForTimeInterval:0.25];
}
NSLog(@".. continuing");

... Но я не могу не думать, что должен быть более хороший путь, возможно, с использованием NSLocks или чего-то подобного.

Комментарии, подсказки, предложения?

Спасибо!

12.10.2009 21:35:16
1 ОТВЕТ
РЕШЕНИЕ

Посмотрите в NSCondition и условия раздела в руководстве Threading. Код будет выглядеть примерно так:

NSCondition* condition; // initialize and release this is your app requires.

//Worker thread:
while([NSThread currentThread] isCancelled] == NO)
{
    [condition lock];
    while(partySuppliesAvailable == NO)
    {
        [condition wait];
    }

    // party!

    partySuppliesAvailable = NO;
    [condition unlock];
}

//Main thread:
[condition lock];
// Get party supplies
partySuppliesAvailable = YES;
[condition signal];
[condition unlock];
26
12.10.2009 23:24:14
Именно то, что мне было нужно. Спасибо.
Olie 15.10.2009 01:04:22
Также обратите внимание, что для будущих spelunkers:, NSConditionLockгде вы делаете что-то вроде [condition lockWhenCondition: suppliesAvailable]; mySupplies = [supplyQueue contents]; [supplyQueue removeAllSupplies]; [condition unlockWithCondition: noSuppliesAvailable]; // spend mySupplies as desired, это очень полезный шаблон. В моем случае, вместо partySupplies, я использую их как данные, которые нуждаются в обработке. QED.
Olie 27.05.2014 20:18:54
+1 за начало вечеринки. : D Отличное использование partySuppliesAvailable и // party!
Alexandru 16.06.2014 00:45:45