2009-07-26 12 views
18

Tengo un programa que está teniendo problemas durante el cierre, lo que genera excepciones que no puedo rastrear a su origen. Parece estar relacionado con el tiempo y no determinista. Esto ocurre después de que se liberaron todos los recursos compartidos y, dado que está apagado, las pérdidas de memoria no son un problema, así que me pregunto si hay alguna manera de decirle al programa que finalice inmediatamente y silenciosamente después de liberar los recursos compartidos, en lugar de continuando con la secuencia de apagado y dando un cuadro de mensaje de excepción.¿Cómo abortas limpiamente un programa Delphi?

¿Alguien sabe cómo hacer eso?

+1

Qué tipo de programa es? Aplicación de la consola? Basado en TA? ¿Está intentando depurar/entrar/al proceso de cierre? –

+0

Basada en la solicitud, y sí, y no está funcionando. Parece estar relacionado con el tiempo, más el depurador es más o menos inútil en esta aplicación. Vea http://qc.embarcadero.com/wc/qcmain.aspx?d=76039 por la razón. –

Respuesta

18

Después de mirar el código fuente de Delphi Run Time Library y en la documentación de Microsoft; Puedo corroborar los comentarios de Mason y Paul-Jan.

La jerarquía de apagado es el siguiente

Application.Terminate() 
    performs some unidentified housekeeping of application 
    calls Halt() 

    Halt() 
    calls ExitProc if set 
    alerts the user in case of runtime error 
    get rid of PackageLoad call contexts that might be pending 
    finalize all units 
    clear all exception handlers 
    call ExitprocessProc if set 
    and finally, call ExitProcess() from 'kernel32.dll' 

    ExitProcess() 
    unloads all DLLs 
    uses TerminateProcess() to kill the process 
+0

'TApplication.Terminate()' no llama a 'Halt()'. Llama a una lista de procs de terminación, si está configurada, y luego publica un mensaje 'WM_QUIT' en la cola de mensajes del subproceso de llamada. Cuando 'TApplication.Run()' recoge el 'WM_QUIT', rompe su ciclo de mensajes y sale, volviendo al bloque de código principal del proyecto que luego sale, lo que activa la limpieza del proceso. –

4

Detener (0) solía ser la buena manera antigua de decirle al programa que termine con efecto inmediato. Probablemente haya una manera más amigable con Delphi de hacerlo ahora, pero estoy 95% seguro de que detener (0) aún funciona. :-)

+1

Definitivamente funciona, pero igual hará un procesamiento limpio y agradable de todas las piezas de finalización y salidas. Si uno de esos dispara el problema de Mason, él todavía está en problemas. –

4

En el caso de la sugerencia de utilizar HeartWare ExitProcess() falla, puede ser que esté utilizando alguna DLL que no responden bien a la DLL_PROCESS_DETACH. En ese caso, intente utilizar TerminateProcess (getCurrentProcess, 0);

Una vez que recurra a tales medidas, uno podría preguntarse si la parte "limpia" del título del tema aún se mantiene bajo escrutinio.

+2

¡Oh, podría lavarse las manos después de hacer eso, lo mantiene limpio! – Arafangion

1

La última vez que tuve que cazar un problema como este fue el cierre fue una causando un evento (cambio de tamaño? Ha sido un tiempo.) Para disparar en la ventana de morir causando un intento de volver a dibujar algo que necesitaba cosas que ya tenía sido desechado

Cuestiones relacionadas