Quiero implementar tareas interrumpibles basadas en hilos de fondo. ¿Cuál es la forma más limpia de implementar el método TTask.Stop
? ¿Cómo puedo abortar el hilo de fondo?¿Aborta un hilo?
El código ejecutado en el contexto del subproceso se pasa a la tarea utilizando un método anónimo y puede contener llamadas de bloqueo, por lo que no puedo confiar en que el indicador Terminated
se verifique regularmente desde el código.
Gracias por cualquier entrada.
Usando D2010 en caso de que importa (algunas cosas en TThread
parecen haber cambiado)
Esa es una buena (+1) respuesta; cf. Enlazado de Python, donde mucho se hace de Global Interpreter Lock, que es responsable tanto de la seguridad del hilo (bueno) como de todos los propósitos prácticos, limita el código multiproceso a un solo núcleo (malo). La mejor solución para ese problema es no utilizar hilos, sino procesos a través del paquete de multiprocesamiento, y lo que se gana con esta capacidad instantánea de escalar a través de múltiples máquinas, lo que eventualmente se vuelve necesario para grandes escalas de todos modos. En lugar de preocuparse por la seguridad de los hilos, sería mejor tener una administración de multiprocesos fácil (más fácil) en Delphi. –
Los semáforos no tienen un estado "abandonado" porque no tienen ninguna noción incorporada de propiedad. (En lo que respecta al sistema operativo, un hilo no puede "contener" un semáforo). Solo un mutex puede abandonarse de manera detectable. –
Esta puede ser una buena manera de implementar tareas interrumpibles con código de bloqueo, sin embargo, no veo cómo la funcionalidad de la pregunta (una tarea interrumpible para métodos anónimos) debe implementarse así con Delphi. Tendría que haber un compilador en tiempo de ejecución, para crear un ejecutable (que se genere como un proceso diferente) del método anónimo, ¿no? – mghie