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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top