2010-07-07 9 views
7

J'ai créé un sous-fil à l'aide NSThread dans thread principalComment arrêter un NSThread sous-thread iphone

NSThread *newThread = [[NSThread alloc] initWithTarget:self selector:@selector(MyThread:) object:timer];

5 secondes plus tard, je l'ai utilisé [newThread annuler] dans le thread principal pour arrêter la sous -thread, mais le tir travail,

Méthode MyThread: en newThread travaille toujours

donc, ce qui est la bonne réponse pour arrêter newThread, THX

en fait [newThread isCancelled] est OUI, mais sélecteur MyThread est encore WOKING

+1

timer est NSTimer exemple – None

Répondre

10

La méthode cancel informe que le fil qu'il est annulé (comme vous l'avez mentionné les changements du isCancelled à YES. C'est alors la responsabilité du thread lui-même de vérifier cela et de quitter. Par exemple, dans votre méthode MyThread: vous pouvez le faire:

// At some checkpoint 
if([[NSThread currentThread] isCancelled]) { 
    /* do some clean up here */ 
    [NSThread exit]; 
} 

Vous devez effectuer cette vérification périodique et sortie à l'intérieur du fil comme indiqué; sinon, le cancel n'a aucun effet.

+0

vous dire un fil ne peut être annulé par lui-même, et non par un autre thread ou thread principal? – None

+1

@None: Cela signifie que "annuler" un thread ne fait pas ce que vous pensez. Lorsque vous annulez un thread, il provoque le retour de 'isCancelled'' YES'. Le thread devrait alors arrêter l'exécution. Cela ne force cependant pas le thread à arrêter immédiatement l'exécution, ce qui serait gênant si des ressources étaient ouvertes. – Chuck

+0

@Chuck: Merci, mais si je veux arrêter un sous-thread dans le fil principal, comment dois-je faire? – None

1

- (void) annuler

Discussion La sémantique de ce procédé sont les mêmes que celles utilisées pour l'objet NSOperation. Cette méthode définit les informations d'état dans le récepteur qui sont ensuite reflétées par la méthode isCancelled. Les threads qui prennent en charge l'annulation doivent appeler périodiquement la méthode isCancelled pour déterminer si le thread a effectivement été annulé et quitter si cela a été le cas.

plus d'informations, voir NSThread API Reference