Ниже приведен runloop для моего вторичного NSThread * processThread
Чтобы закрыть тему я звоню
//cancel secondary thread
[processThread cancel]
//signal condition
[processCondition broadcast];
Безопасно ли тогда звонить:
[processCondition release];
[processThread release];
или мне нужно быть уверенным, что поток завершен?
Возможно, так?
NSTimeInterval timeout = [NSDate timeIntervalSinceReferenceDate] + (1.0/15.0);
while ([processThread isExecuting] && [NSDate timeIntervalSinceReferenceDate] < timeout)
{
[NSThread sleepForTimeInterval: 1.0/1000.0 ];
}
[processCondition release];
[processThread release];
подробный код и пояснение:
- (void)processLoop
{
NSAutoreleasePool * outerPool = [[NSAutoreleasePool alloc] init];
[processCondition lock];
//outer loop
//this loop runs until my application exits
while (![[NSThread currentThread] isCancelled])
{
NSAutoreleasePool *middlePool = [[NSAutoreleasePool alloc];
if(processGo)
{
//inner loop
//this loop runs typically for a few seconds
while (processGo && ![[NSThread currentThread] isCancelled])
{
NSAutoreleasePool *innerPool = [[NSAutoreleasePool alloc]; init];
//within inner loop
//this takes a fraction of a second
[self doSomething];
[innerPool release];
}
[self tidyThingsUp];
}
else
{
[processCondition wait];
}
[middlePool release];
}
[processCondition unlock];
[outerPool release];
}
комбинация:
- внутренний цикл while
- NSCondition * processCondition
- переключение
processGo
между YES
и NO
позволяет мне останавливать и запускать внутренний цикл while, не отменяя поток.
if (processGo == YES)
выполнение входит во внутренний цикл while.
Когда основной поток устанавливает
processGo = NO
выполнение оставляет внутренний цикл while и приводит в порядок
при следующем проходе внешнего цикла выполнение достигает
[processCondition wait]
и ждет
если основной поток сбрасывается
processGo == YES
и звонки
[processCondition wait]
выполнение повторно входит во внутренний цикл