2009-10-12 9 views
14

que tienen un subproceso de trabajo que yo quiero hacer un poco de su tarea, a continuación, hacer una pausa & espera para el comando "ok, continuará" de otro hilo, a continuación, hacer una pausa & de espera, etc.¿Cómo pausar un NSThread hasta que se notifique?

El caso de uso es: el objeto de control es una vista que quiero mostrar información sobre lo que está sucediendo dentro del hilo de trabajo, y me permite "pasar un solo paso" a través del trabajador como lo hace.

Lo más feo y torpe que tengo en mi trabajador es la siguiente:

NSLog(@"paused"); 
paused = YES; 

while (paused) 
{ 
    [NSThread sleepForTimeInterval:0.25]; 
} 
NSLog(@".. continuing"); 

... pero no puedo evitar pensar que tiene que haber una manera más agradable, tal vez la participación NSLocks , o algo así.

Comentarios, sugerencias sugerencias?

Gracias!

Respuesta

25

Consulte NSCondition y la sección Conditions en la guía de enhebrado. El código se verá algo así como:

NSCondition* condition; // initialize and release this is your app requires. 

//Worker thread: 
while([NSThread currentThread] isCancelled] == NO) 
{ 
    [condition lock]; 
    while(partySuppliesAvailable == NO) 
    { 
     [condition wait]; 
    } 

    // party! 

    partySuppliesAvailable = NO; 
    [condition unlock]; 
} 

//Main thread: 
[condition lock]; 
// Get party supplies 
partySuppliesAvailable = YES; 
[condition signal]; 
[condition unlock]; 
+0

Exactamente lo que necesitaba. Gracias. – Olie

+2

También tenga en cuenta, para futuros spelunkers: 'NSConditionLock', donde se hace algo como' [condition lockWhenCondition: suppliesAvailable]; mySupplies = [contenido de supplyQueue]; [supplyQueue removeAllSupplies]; [condición unlockWithCondition: noSuppliesAvailable]; // gastar mySupplies como se desee' es un patrón muy útil. En mi caso, en lugar de partySupplies, lo tengo como datos que necesitan procesamiento. QED. – Olie

+0

+1 para comenzar la fiesta. : D Gran uso de partySuppliesAvailable y // party! – Alexandru

Cuestiones relacionadas