He escrito una aplicación (utilizando Delphi 2009) que permite al usuario seleccionar una serie de consultas que se pueden ejecutar en una serie de sistemas diferentes. Para permitir que las consultas se ejecuten simultáneamente, cada consulta se ejecuta en su propio hilo, utilizando un objeto TADOQuery. Todo esto funciona bienAplicación multiproceso (TThread) Delphi no terminará
El problema que tengo es cuando trato de cerrar la aplicación cuando todavía se está ejecutando una consulta (y, por lo tanto, hay un hilo separado activo). Cuando creo cada hilo, grabo THandle del hilo en una matriz. Cuando intento cerrar la aplicación, si todavía hay algún subproceso en ejecución, recupero el identificador del subproceso y lo paso a TerminateThread, que en teoría debería finalizar el subproceso y permitir que se cierre la aplicación. Sin embargo, esto no sucede. Se desencadena el evento onClose de la forma principal y parece que la aplicación se está cerrando, pero el proceso permanece activo y aparece mi interfaz Delphi como si la aplicación aún se estuviera ejecutando (es decir, el botón "Ejecutar" gris, depuración, etc.). No devuelvo el control a Delphi hasta que termine el proceso manualmente (ya sea Ctrl-F2 en Delphi o a través del Administrador de tareas).
Estoy usando TerminateThread porque la consulta puede tomar mucho tiempo para ejecutarse (unos minutos en casos en que estamos tratando con un millón de registros, que en el entorno del usuario final es perfectamente posible) y mientras está en ejecución, a menos que esté equivocado, el hilo no podrá verificar la propiedad Terminated y, por lo tanto, no podrá terminar si se estableció en True hasta que la consulta haya regresado, por lo que no puedo finalizar el hilo de la forma habitual (es decir, verificando la propiedad Terminated). Puede ser que el usuario quiera salir de la aplicación mientras se está ejecutando una consulta grande, y en ese caso, necesito que la aplicación finalice inmediatamente (es decir, todos los subprocesos en ejecución finalicen inmediatamente) en lugar de forzarlos a esperar hasta que todas las consultas tengan terminado de ejecutarse, por lo que TerminateThread sería ideal pero en realidad no está terminando el hilo!
¿Alguien puede ayudar aquí? ¿Alguien sabe por qué TerminateThread no funciona correctamente? ¿Alguien puede sugerir algo para que los subprocesos ejecuten grandes consultas de ADO para que finalicen inmediatamente?
Gracias por su ayuda!
Esto parece el camino a seguir. He estado trabajando en otra cosa durante la última semana, pero lo investigaré en los próximos días. ¿Tienes un ejemplo de alguna fuente para esto? – Jeedee