Esta pregunta involucra a Delphi y XE específicamente desaprobatorio Suspender y reanudar. He leído otras publicaciones y hasta ahora no he encontrado un uso similar, así que voy a seguir adelante y solicitar una discusión.Auto Suspendiendo un hilo en Delphi cuando no es necesario y reanudando de manera segura
Lo que me gustaría saber es si hay una mejor manera de pausar un hilo cuando no es necesario?
Tenemos una clase Delphi que hemos utilizado durante años, que es básicamente una cola FIFO que está asociada a un proceso enhebrado. La cola acepta un objeto de datos en el hilo principal y si el hilo se suspende, lo reanudará.
Como parte del proceso Ejecutar del subproceso, el objeto se saca de la cola y se procesa en el subproceso. Por lo general, esto es hacer una búsqueda en la base de datos.
Al final del proceso, una propiedad del objeto se actualiza y se marca como disponible para el hilo principal o se pasa a otra cola. El último (bueno, realmente es el primer paso) del proceso de ejecución es comprobar si hay más elementos en la cola. Si hay continúa, de lo contrario se suspende.
La clave es la única acción de suspensión dentro del ciclo de ejecución cuando se completa, y se invoca el único resumen durante las operaciones normales cuando se coloca un nuevo elemento en la cola. La excepción es cuando la clase de cola se termina.
La función de reanudación se ve más o menos así.
process TthrdQueue.MyResume();
begin
if Suspended then begin
Sleep(1); //Allow thread to suspend if it is in the process of suspending
Resume();
end;
end;
La ejecución es similar a esto
process TthrdQueue.Execute();
var
Obj : TMyObject;
begin
inherited;
FreeOnTerminate := true;
while not terminated do begin
if not Queue.Empty then begin
Obj := Pop();
MyProcess(Obj); //Do work
Obj.Ready := true;
end
else
Suspend(); // No more Work
end; //Queue clean up in Destructor
end;
El TthrdQueue Empuje llamadas de rutina MyResume después de añadir otro objeto en la pila. MyResume solo llama a Reanudar si el hilo está suspendido.
Al apagar establecemos terminar en verdadero y llamar a MyResume si se suspende.
No soy un experto pero simplemente utilizaría Sleep (250) o SignalObjectAndWait (ver msdn) para un control más exacto. –