No, su código no es buena (aunque probablemente funcionará en 99,99% o incluso el 100% de los casos). Si planea terminar el hilo de trabajo desde el hilo principal, no configure FreeOnTerminate en True (no veo lo que está tratando de ganar en el código anterior al configurar FreeOnTerminate en True, al menos hace que su código sea menos comprensible) .
Una situación más importante con la terminación de subprocesos de trabajo es que está intentando cerrar una aplicación mientras el subproceso de trabajo está en estado de espera. El hilo no se activará si solo llamas a Terminate, generalmente deberías usar un objeto de sincronización adicional (generalmente evento) para activar el hilo de trabajo.
Y una observación más - no hay necesidad de
begin
MyThread.Terminate;
MyThread.WaitFor;
MyThread.Free;
end;
si nos fijamos en el código TThread.Destroy, llama a terminar y WaitFor, por lo
MyThread.Free;
es suficiente (al menos en Delphi 2009, no tiene fuentes de Delphi 7 para verificar).
Actualizado
Leer mghie respuesta. Considere la siguiente situación (mejor en 1 sistema de la CPU):
hilo principal está ejecutando
procedure TMainForm.Close;
begin
if not MyThreadReady then
begin
MyThread.Terminate;
MyThread.WaitFor;
MyThread.Free;
end;
end;
lo revisen valor MyThreadReady (que es falso) y se apagó por el programador.
Ahora el planificador cambia a hilo de trabajo; ejecuta
Synchronize(ThreadFinished);
y obliga al programador a volver al hilo principal. El hilo principal continúa la ejecución:
MyThread.Terminate; // no problem
MyThread.WaitFor; // ???
MyThread.Free;
¿Puede decir lo que sucederá en WaitFor? No puedo (requiere una mirada más profunda en TThread fuentes para responder, pero a primera vista parece un punto muerto).
Su error real es algo diferente: ha escrito un código no confiable e intenta averiguar si es correcto o no. Esa es una mala práctica con los hilos; en su lugar, debes aprender a escribir un código confiable.
En cuanto a recursos: cuando finaliza el TThread (con FreeOnTerminate = False) los únicos recursos que quedan asignados es el identificador de subproceso de Windows (no utiliza recursos importantes de Windows después de que finaliza el subproceso) y el objeto Delphi TThread en la memoria. No es un gran costo estar seguro.
¡Hola! FreeOnTerminate solo no es una opción. Por otro lado, no quiero que el hilo acapare la memoria mientras se ejecuta el programa Principal. Estoy sincronizando el booleano porque creo que garantiza que se ejecutará antes de MainForm.Close o después de MainForm.Close. Por lo tanto, MyThread.Terminate solo se invocará si FreeOnTerminate es falso. ¿Estoy equivocado aquí? – Steve
¿Cuánta memoria tiene el hilo 'hog' una vez que ha terminado? Si no puedes decir que no tienes motivo para preocuparte. Mida primero. Pero si insistes, publica un mensaje de tu hilo como último y libera el hilo en el manejador de mensajes. 'Synchronize()' es demasiado vil como para siquiera pensar si tu código funcionaría bajo cualquier circunstancia. Solo dile no a eso. – mghie
Aceptando esto como la solución ya que este es el más limpio. Gracias a todos por las respuestas! – Steve