2009-03-13 11 views
6

Estoy trabajando en una pequeña aplicación escrita en Objectivo-c con la ayuda de la estructura de cacao y estoy teniendo un problema de subprocesamiento múltiple. Realmente agradecería si alguien pudiera ayudarme con alguna orientación sobre cómo terminar un hilo secundario (trabajador) del hilo principal?terminando un hilo secundario del hilo principal (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? 
} 

que he encontrado algo en apple's docs pero lo que falta en este ejemplo es la parte donde la fuente de entrada runloop cambia el valor exitNow.

Además, no usaré muchos subprocesos en mi aplicación, así que preferiría una solución simple (con menos sobrecarga) en lugar de una más compleja que sea capaz de administrar muchos subprocesos fácilmente, pero con más sobrecarga generada (ej. el uso de bloqueos quizá (?) en lugar de runloops)

Gracias de antemano

Respuesta

12

creo que la forma más fácil es usar NSThread de -(void)cancel method. También necesitará una referencia al hilo que ha creado. El código de ejemplo podría ser algo como esto, si se puede hacer el subproceso de trabajo como un bucle:

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

Por supuesto, esto sólo va a cancelar el hilo entre iteraciones del bucle. Por lo tanto, si realiza cálculos de bloqueo prolongados, deberá encontrar la forma de dividirlos en partes para que pueda verificar que se cancelen periódicamente.

+0

Funciona muy bien! ¡Gracias! Tengo un bucle en el hilo, por lo que su solución se ajusta como un guante sin ningún código adicional :) – andi

+0

Puede hacer que el intento del bucle while del threadMain sea más claro haciendo (! [[NSThread currentThread] isCancelled]) en su lugar de while (1) y poner profundamente el código isCancelled en el código del bucle. –

+0

@Barry Wark Buen punto. Supongo que esperaba que hubiera otra condición (por ejemplo, ¡hecho!) En ese ciclo. –

2

También eche un vistazo a las clases NSOperation y NSOperationQueue. Es otro conjunto de clases de subprocesos que hacen que el desarrollo de un modelo de subprocesos de trabajo sea muy fácil de hacer.

Cuestiones relacionadas