2010-04-04 8 views
10

Mi programa Delphi depende en gran medida de la automatización de Outlook. Las versiones de Outlook anteriores a 2007-SP2 tienden a atascarse en la memoria debido a complementos mal escritos y código de Outlook mal escrito.Si la terminación de un hilo colgado es una buena idea, ¿cómo lo hago de forma segura?

Si Outlook está atascado, llamar a CreateOleObject ('Outlook.Application') u GetActiveObject ... no devuelve y mantiene mi aplicación pendiente hasta que Outlook.exe se cierra en el administrador de tareas.

He pensado en una solución, pero no estoy seguro de si es una buena práctica o no.

Comenzaría Outlook con CreateOleObject en un hilo separado, esperaría 10 segundos en mi hilo principal y si Outlook se cuelga (CreateOleObject no regresa), le ofrezco al usuario que elimine el proceso Outlook.exe de mi programa.

Pero como no quiero force el usuario para matar el proceso de Outlook.exe, como alternativa también necesito una forma de matar el nuevo hilo en mi programa que sigue colgando ahora.

  1. ¿Es esta una buena práctica?
  2. ¿Cómo puedo terminar un hilo colgante en Delphi sin que haya una pérdida de memoria?
+2

"mal escrito" estará al alcance ya sea como inflamatoria por algunos, o como redundante por los que se han ocupado de estos antes. Comparto tu dolor, hermano ... –

Respuesta

10

Windows tiene una función TerminateThread, pero como puede ver en las observaciones, generalmente no es una buena idea usarla. Un enfoque más seguro sería tener una aplicación secundaria que interactúe con Outlook, y luego podría eliminarla sin afectar la estabilidad de su propia aplicación. TerminateProcess funcionaría, pero si quería ser un poco más amable con el sistema, el Dr. Dobbs tiene un article en un enfoque posiblemente más seguro al usar ExitProcess.

Si el bloqueo es constante y siempre ocurre o no sucede, puede simplemente llamar a CreateOleObject en la aplicación y salir, luego llamarlo nuevamente desde su cuenta. Si es inconsistente, la aplicación secundaria podría ser un contenedor más completo, y todas las interacciones pasarían por ello.

+0

Gracias, no pensé en una aplicación por separado, pero esto ha resuelto por completo mi problema. Estoy usando ShellExecuteEx para iniciar la otra aplicación (que tiene una sola llamada a CreateOleObject) y si la aplicación generada no regresa, finalizo outlook o la aplicación a petición del usuario. – Steve

Cuestiones relacionadas