Solía pensar que era una persona razonablemente inteligente.
La "guía de programación de enhebrado" de apple ha hecho añicos mi egoísmo autodestructivo.Objective-C ejecutar lazo para detener y reiniciar el método?
Tengo un método que quiero ejecutar repetidamente en una secuencia secundaria, en el siguiente ejemplo lo he llamado doStuff:
Quiero poder detener e iniciar repetidamente las llamadas repetidas de este método.
el código comienza el hilo.
si el valor stuffToDo booleana es verdadera,
A continuación, llama hacerTarea:
lo contrario
Tiene un poco de descanso.
luego se repite hasta que digo que se detenga
Mi código actual parece un desperdicio, porque sigue comprobando "cosas que hacer" incluso cuando no hay nada que hacer.
Podría deshacerme de stuffToDo y solo generar y cancelar el hilo según sea necesario.
Esto también parece un desperdicio, y significa que tendría que tener cuidado de no generar accidentalmente un nuevo hilo cuando ya tengo uno en ejecución.
Estoy seguro de que la respuesta a la solución de manera eficiente mi situación puede ser encontrado en alguna parte de la sección "Gestión de bucle de ejecución" de "enhebrado guía de programación" de Apple
quizá se trata de fuentes de entrada personalizados
pero estoy realmente encontrar este documento desafiante.
Es como si este documento está generando demasiados hilos en mi cerebro y la computación se detiene.
enum eRenderThreadMode
{
render_not_started,
render_run,
render_cancel,
render_finished
};
- (IBAction) startThread:(id)sender
{
self.renderThreadMode = render_run;
label.text = @"doing stuff";
[NSThread detachNewThreadSelector:@selector(keepDoingStuff) toTarget:self withObject:nil];
}
- (void)keepDoingStuff
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
while (renderThreadMode == render_run)
{
if(stuffToDo)
{
[self doStuff];
}
else
{
[NSThread sleepForTimeInterval:kLittleRest];
}
}
self.renderThreadMode = render_finished;
[pool release];
}
- (IBAction)stopThread:(id)sender
{
self.renderThreadMode = render_stop;
while (self.renderThreadMode == render_cancel)
{
[NSThread sleepForTimeInterval:kLittleRest];
}
}
De acuerdo. Use un NSConditionLock. Esta es una construcción de enhebrado estándar. –
gracias, parece que va a hacer exactamente lo que quiero –
Utilicé NSCondition, como se sugirió, en lugar de NSConditionLock. ¿Realmente quisiste decir ConditionLock en vez de esa Condición? Si es así, ¿cómo te imaginas implementar esto usando NSConditionLock. No he trabajado con subprocesos objetivos c antes, y estoy interesado en conocer diferentes enfoques. –