2016-10-12 5 views
0

Je suis en cours d'exécution d'une fonction doTask dans un autre thread comme ci-dessous:Tuez un autre fil dans mon cas

NSThread *otherThread = [[NSThread alloc] initWithTarget:self 
               selector:@selector(doTask) 
                object:nil]; 
[otherThread start]; 

... 
-(void)doTask{ 
    ... 
} 

Quelle est la bonne façon de tuer otherThread de thread courant?

Je sais que [otherThread cancel] seulement marque le otherThread devrait être tué mais pas vraiment le tuer.

+0

Il est toujours préférable de * demander * à l'autre thread de se terminer, plutôt que * tell * it. Ce sera beaucoup plus propre de cette façon. – Droppy

+0

Oui, je comprends cela, mais comment dans mon cas puis-je demander à otherThread de se terminer? –

+0

Inconnu; Cela dépend de la relation entre les classes. – Droppy

Répondre

-1

Vous pouvez appeler [otherThread cancel] après l'invalidation des temporisations ou l'arrêt d'autres opérations fastidieuses que le thread exécute actuellement. Si vous nettoyez correctement et appelez annuler, il devrait tuer le fil.

+0

mais 'exit' est une méthode de classe pas une méthode d'instance dans NSThread. –

+0

Stupide, mon erreur. Quel genre de tâche courez-vous dans doTask? – Yord

0

doTask doit vérifier un état quelque part périodiquement pour voir s'il doit se terminer tôt. Un simple BOOL est assez bon.

@interface MyTask:NSObject 
@property(atomic) BOOL keepGoing; 
@end 

@implementation MyTask 
- (void) calculate 
{ 
    while(_keepGoing && _workQueueHasStuff) { 
     .... process some stuff .... 
    } 
    if (!_keepGoing) { 
     ... early termination ... 
    } else { 
     ... work queue depleted ... 
    } 
} 

Ou, comme l'a dit S.S, utilisez l'API isCancelled/-cancel comme prévu


Vous ne pouvez pas tuer un fil directement à partir de l'extérieur du fil.