2010-07-07 8 views
7

utworzonego podpotok gwintu przy NSThread w głównym gwintemJak zatrzymać NSThread podpotok nić re

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

5 s później wykorzystane [newThread Cancel] głównym gwintem zatrzymać sub -thread, ale nie działał,

Method MyThread: w newThread nadal pracuje

więc, co jest poprawna odpowiedź, aby zatrzymać newThread THX

faktycznie [newThread isCancelled] TAK, ale selektor MyThread wciąż Woking

+1

czasomierz jest NSTimer instancja – None

Odpowiedz

10

Sposób cancel informuje tylko, że wątek jest anulowane (jak wspomniano zmian, jakie isCancelled do YES. Wówczas to sam wątek sprawdza to i kończy działanie. Na przykład, w sposobie MyThread: można to zrobić:

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

Należy zrobić to sprawdzanie Okresowo, a wyjście z zasięgu wątku, jak pokazano; w przeciwnym razie cancel nie ma żadnego efektu.

+0

znaczy nitki może być odwołany tylko przez siebie, a nie innego wątku lub głównego wątku? – None

+1

@None: Oznacza to, że "anulowanie" wątku nie robi tego, co myślisz. Kiedy anulujesz wątek, powoduje on, że 'isCancelled' zwraca" TAK ". Wątek powinien następnie przestać wykonywać. Nie wymusza to jednak natychmiastowego zatrzymania wykonywania wątku - byłoby to kłopotliwe, gdyby miał otwarte zasoby. – Chuck

+0

@Chuck: Dziękuję, , ale jeśli chcę zatrzymać sub wątek w wątku głównym, jak mam to zrobić? – None

1

- (void) anulowania

Dyskusja semantyka tego sposobu są takie same, jak te stosowane do obiektu NSOperation. Ta metoda ustawia informacje o stanie w odbiorniku, które są następnie odzwierciedlane metodą isCancelled. Wątki, które obsługują anulowanie, powinny okresowo wywoływać metodę isCancelled w celu ustalenia, czy wątek został rzeczywiście anulowany, i zakończyć, jeśli tak się stało.

więcej informacji patrz NSThread API Reference