завершение вторичного потока из основного потока (какао) - PullRequest
6 голосов
/ 13 марта 2009

Я работаю над небольшим приложением, написанным на target-c с помощью фреймворка Cocoa, и у меня возникла проблема с многопоточностью. Я был бы очень признателен, если бы кто-нибудь мог помочь мне с некоторыми советами о том, как завершить вторичный (рабочий) поток из основного потока?

- (IBAction)startWorking:(id)sender {
     [NSThread detachNewThreadSelector:@selector(threadMain:) toTarget:self withObject:nil];
}

- (void)threadMain
{
  // do a lot of boring, time consuming I/O here..
}

- (IBAction)stop:(id)sender {
  // what now?
}

Я нашел что-то в документах Apple , но в этом примере не хватает той части, где источник ввода runloop изменяет значение exitNow .

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

Заранее спасибо

Ответы [ 2 ]

12 голосов
/ 13 марта 2009

Я думаю, что самый простой способ - использовать - (void) метод отмены NSThread . Вам также понадобится ссылка на созданную вами тему. Ваш пример кода будет выглядеть примерно так, если вы можете сделать рабочий поток в виде цикла:

- (IBAction)startWorking:(id)sender {
     myThread = [[NSThread alloc] initWithTarget:self selector:@selector(threadMain:) object:nil];
     [myThread start];
}

- (void)threadMain
{
    while(1)
    {
        // do IO here
        if([[NSThread currentThread] isCancelled])
            break;
    }
}

- (IBAction)stop:(id)sender {
   [myThread cancel];
   [myThread release];
   myThread = nil; 
}

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

2 голосов
/ 14 марта 2009

Также взгляните на классы NSOperation и NSOperationQueue. Это еще один набор классов потоков, которые делают разработку модели рабочего потока очень простой.

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