thread programacion multihilo ejemplo delphi

programacion - Cómo matar un hilo en delphi?



delphi thread ejemplo (5)

En Delphi, un método en TThread es terminado. Parece que un subhebra no puede matar a otro subproceso al llamar a terminación o libre. Por ejemplo A (forma principal), B (una unidad de subprocesos), C (otra forma).

B está enviando datos a la forma principal y C (llamando a syncronize), intentamos terminar B dentro de C mientras que B se está ejecutando llamando a B.terminate. Pero este método no funciona y B sigue funcionando hasta que termina en el método de ejecución.

Por favor ayuda. Gracias de antemano.


Actualmente,

Actualmente, la respuesta más votada a esta pregunta es incorrecta (como 34 videntes ascendentes ...) con respecto a cómo matar a la fuerza un hilo.

No utiliza ThreadId como parámetro para el procedimiento TerminateThread . Usar ThreadId causará probablemente un error de "Identificador no válido" o en el peor de los casos scenerio - matará un hilo diferente.

Debe pasar un identificador de subproceso como un parámetro:

TerminateThread(MyThread.Handle);

Se puede encontrar más información sobre las diferencias entre el identificador de subprocesos y el ID here .

Editar

Parece que él mismo corrigió su error después de ver mi respuesta, por lo que ya no es relevante.


Debes verificar si Terminate en el hilo para que funcione. Por ejemplo:

procedure TMyThread.Execute; begin while not Terminated do begin //Here you do a chunk of your work. //It''s important to have chunks small enough so that "while not Terminated" //gets checked often enough. end; //Here you finalize everything before thread terminates end;

Con esto, puedes llamar

MyThread.Terminate;

Y terminará tan pronto como termine de procesar otro pedazo de trabajo. A esto se le llama "finalización elegante del hilo" porque el hilo en sí tiene la oportunidad de terminar cualquier trabajo y prepararse para la finalización.

Hay otro método, llamado ''terminación forzada''. Puedes llamar:

TerminateThread(MyThread.Handle);

Cuando hace esto, Windows detiene con fuerza cualquier actividad en el hilo. Esto no requiere la verificación de "Terminado" en la secuencia, pero potencialmente puede ser extremadamente peligroso, porque estás matando el hilo en el medio de la operación. Su aplicación puede bloquearse después de eso.

Es por eso que nunca usas TerminateThread hasta que estés absolutamente seguro de que tienes todas las consecuencias posibles resueltas. Actualmente no lo haces, así que usa el primer método.


Si desea terminar un hilo, sería mejor que genere otra aplicación y lo matara si cree que ha fallado; Windows luego se pondrá en orden después de usted.


Terminar no mata un hilo; establece la propiedad Terminated para informar al hilo que debe terminar. Es responsabilidad del hilo mirar Terminated y apagarse con gracia.


Todo el método Terminate hace es establecer la propiedad Terminated en verdadero. Por lo tanto, debe seguir comprobando manualmente esa propiedad y luego salir del método de subproceso cuando se establece en verdadero.