Comment pouvez-vous interrompez proprement un programme Delphi?
Question
J'ai un programme qui a un peu de difficulté lors de l'arrêt, ce qui soulève des exceptions que je ne peux pas remonter à leur source. Il semble chronométrer liée et non déterministe. Cela se produit après que toutes les ressources partagées ont été libérés, et comme il est l'arrêt, les fuites de mémoire ne sont pas un problème, ce qui me demande s'il y a un moyen de simplement dire au programme de mettre fin immédiatement et en silence après avoir relâché les ressources partagées, au lieu de la poursuite de la séquence d'arrêt et donnant une boîte de message d'exception.
Quelqu'un sait comment faire?
La solution
Après avoir regardé le code source bibliothèque Delphi en temps d'exécution et à la documentation de Microsoft; Je peux confirmer Mason et commentaires Paul-Jan.
La hiérarchie d'arrêt est la suivante
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
Autres conseils
ExitProcess (0)?
Halt (0) utilisé pour la bonne façon ancienne de dire le programme pour mettre fin avec effet immédiat. Il y a probablement une façon plus conviviale Delphi de le faire maintenant, mais je suis 95% sûr arrêt (0) fonctionne toujours. :-)
Dans le cas où la suggestion de HeartWare d'utiliser ExitProcess () échoue, il pourrait être que vous utilisez une DLL qui ne répondent pas bien à la DLL_PROCESS_DETACH. Dans ce cas, essayez d'utiliser un TerminateProcess (GetCurrentProcess, 0);
Une fois que vous avez recours à de telles mesures, on peut se demander si la partie « proprement » du titre du sujet tient toujours à l'examen.
La dernière fois que je devais chasser un problème comme celui-ci était l'arrêt a été une cause d'un événement (redimensionne? Il a été un moment.) De tirer sur la fenêtre en train de mourir provoquant une tentative de redessiner quelque chose qui avait besoin des choses qui avaient déjà été éliminer.