Comment avez-vous proprement interrompre un programme Delphi?
J'ai un programme qui rencontre quelques difficultés lors de l'arrêt, le déclenchement d'exceptions que je ne peux pas remonter à leur source. Il semble être lié à la synchronisation et à la non-déterministe. Cela se produit après que toutes les ressources partagées ont été libérés, et puisque c'est l'arrêt, des fuites de mémoire ne sont pas un problème, donc, qui me fait me demander si il y a moyen de juste de dire au programme de résilier immédiatement et de manière silencieuse après la sortie de ressources partagées, au lieu de continuer avec la séquence d'arrêt et donnant une boîte de message d'exception.
Personne ne sait comment faire cela?
- Ce genre de programme? Application Console? TApplication base? Vous essayez de déboguer /dans/ le processus d'arrêt?
- TApplication base, et oui je le suis, et ça ne fonctionne pas. Il semble être lié à la synchronisation, plus le débogueur est plus ou moins inutile dans cette application. Voir qc.embarcadero.com/wc/qcmain.aspx?d=76039 pour la raison.
Vous devez vous connecter pour publier un commentaire.
Après avoir regardé le Delphi Moment de l'Exécution de Bibliothèque de code source, et à la documentation de Microsoft; je peux corroborer Mason et Paul-Janv commentaires.
La hiérarchie de l'arrêt est comme suit
TApplication.Terminate()
n'appelle pasHalt()
. Il appelle une liste de résiliation procs, si elle est définie, et puis postes unWM_QUIT
message pour le thread appelant file d'attente de messages. LorsqueTApplication.Run()
ramasse leWM_QUIT
, il se casse la boucle de message et de sorties, de retour pour le projet principal de bloc de code qui quitte ensuite, le déclenchement du processus de nettoyage.ExitProcess(0) ?
L'arrêt(0) utilisé pour être à la bonne vieille manière de raconter le programme à la fin, avec effet immédiat. Il y a probablement une plus Delphi la meilleure façon de le faire maintenant, mais je suis sûr à 95% que l'arrêt(0) fonctionne toujours. 🙂
Dans le cas du dispositif heartware la suggestion de l'utilisation de ExitProcess() échoue, il serait peut-être êtes-vous à l'aide de quelques DLL qui ne répondent pas bien à la DLL_PROCESS_DETACH. Dans ce cas, essayez d'utiliser un TerminateProcess( fonction getcurrentprocess, 0 );
Une fois que vous avez recours à de telles mesures, on peut se demander si la "proprement" une partie du titre de la rubrique tient toujours à l'examen.
La dernière fois que j'ai eu à chasser un problème, comme cela a été la fermeture a été un entraînant un événement (redimensionner? Il a été un moment.) à faire feu sur le train de mourir fenêtre, provoquant une tentative pour redessiner quelque chose qui a besoin de trucs qui ont déjà été éliminés.