2009-03-13 19 views
6

Sto lavorando su una piccola app scritta in ogg-c con l'aiuto del framework del cacao e sto avendo un problema di multithreading. Gradirei davvero che qualcuno potesse aiutarmi con alcune indicazioni su come terminare un thread secondario (lavoratore) dal thread principale?terminazione di un thread secondario dal thread principale (cacao)

- (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? 
} 

ho trovato qualcosa sul apple's docs, ma ciò che manca da questo esempio è la parte in cui la sorgente di ingresso runloop cambia il valore exitNow.

Inoltre, non userò molti thread nella mia app, quindi preferirei una soluzione semplice (con meno overhead) piuttosto che una più complessa che sia in grado di gestire facilmente molti thread, ma con più overhead generato (ad es. utilizzando serrature forse (?) al posto di runloops)

Grazie in anticipo

risposta

12

penso che il modo più semplice è quello di utilizzare NSThread di -(void)cancel method. Avrai bisogno di un riferimento al thread che hai creato, pure. Il tuo codice esempio potrebbe essere simile a questo, se si può fare il thread di lavoro come un ciclo:

- (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; 
} 

Naturalmente, questo si cancella solo il filo tra iterazioni del ciclo. Quindi, se stai facendo un lungo calcolo di blocco, dovrai trovare un modo per suddividerlo in pezzi in modo da poter controllare periodicamente.

+0

Funziona benissimo! Grazie! Ho un ciclo nella discussione, quindi la tua soluzione si adatta come un guanto senza alcuna interruzione di codice aggiuntiva :) – andi

+0

Si potrebbe rendere l'intento del thread while mentre si cancella il ciclo mentre [! [[NSThread currentThread] isCancelled]) invece di while (1) e mettendo il controllo isCancelled in profondità nel codice di loop. –

+0

@Barry Wark Buon punto. Immagino che mi aspettavo che ci fosse un'altra condizione (ad esempio.!) In quel ciclo. –

2

Dai anche un'occhiata alle classi NSOperation e NSOperationQueue. È un altro set di classi di thread che facilita lo sviluppo di un modello di thread di lavoro.

Problemi correlati