ADDEXITPROC |
Ajout une procédure de sortie |
---|---|
Free Pascal | System |
Syntaxe
Procedure AddExitProc(Proc:TProcedure); |
Paramètres
Nom | Description |
---|---|
Proc | Ce paramètre permet d'indiquer le nom de la procédure à ajouter dans la liste de procédure de sortie. |
Description
Cette procédure permet d'ajouter une procédure à exécuter lors du processus de terminaison du programme. À la sortie du programme, toutes les procédures ajoutées de cette manière seront appelées dans l'ordre inverse.
Remarques
- La procédure AddExitProc ajoute Proc à la chaîne de procédures de sortie. A la sortie du programme, toutes les procédures ajoutées de cette manière seront appelées dans l'ordre inverse.
- AddExitProc permet d'exécuter du code à la fin du programme : La fonction AddExitProc est utilisée pour enregistrer une procédure étant exécutée juste avant la fin du programme. Cela permet d'effectuer des actions de nettoyage, comme libérer des ressources, fermer des fichiers ou enregistrer des journaux de bord. Elle est souvent utilisée lorsqu'on ne veut pas modifier directement le bloc finalization des unités.
- AddExitProc fonctionne avec des procédures standard sans paramètres : Les procédures enregistrées avec AddExitProc doivent être des procédures classiques sans paramètres. Il n'est pas possible d'y passer une méthode d'objet ou une procédure avec des paramètres. Cela limite son usage pour les nettoyages globaux plutôt que pour des nettoyages spécifiques à des objets. Exemple invalide :
- AddExitProc est exécutée dans l'ordre inverse de l'enregistrement : Si plusieurs procédures sont ajoutées via AddExitProc, elles seront appelées dans l'ordre inverse de leur enregistrement. C'est un comportement de type pile LIFO (Last In, First Out). Exemple :
- AddExitProc fonctionne même en cas d'erreur non interceptée : Les procédures enregistrées avec AddExitProc seront appelées même si le programme se termine à cause d'une exception non gérée. Cela permet de garantir qu'un certain nettoyage aura toujours lieu, sauf en cas d'arrêt forcé (exemple : Halt). Exemple :
- AddExitProc ne fonctionne pas si Halt est appelé : Si le programme est interrompu avec la fonction Halt, les procédures enregistrées avec AddExitProc ne seront pas exécutées. C'est une exception importante à connaître, car un programme qui utilise Halt pour gérer certaines erreurs peut empêcher l'exécution du nettoyage prévu. Exemple :
- AddExitProc peut provoquer une erreur d'accès mémoire si elle est mal utilisée : Si une procédure enregistrée avec AddExitProc fait référence à des objets ou variables n'existant plus au moment de l'exécution, cela peut entraîner un segmentation fault ou un comportement indéfini. Exemple dangereux :
- AddExitProc est obsolète pour la gestion moderne des sorties : Bien que AddExitProc soit encore fonctionnelle, elle est considérée comme une ancienne approche en Free Pascal. Aujourd'hui, il est préférable d'utiliser : Le bloc finalization d'une unité pour un nettoyage automatique, des destructeurs d'objets (Destroy) pour la gestion mémoire propre, des gestionnaires d'exceptions (try...finally) pour garantir la libération des ressources. Exemple moderne avec finalization :
Sortie attendue :
Premier nettoyage.Deuxième nettoyage.
Sortie attendue : (Rien, car Cleanup est ignoré)
Ici, si Cleanup tente d'accéder à P après sa libération, le programme peut planter. Il faut s'assurer que toutes les ressources utilisées existent encore avant la sortie.
AddExitProc n'est pas recommandée dans du code orienté objet : Dans un programme basé sur des objets, il est préférable d'utiliser le destructeur des objets (Destroy) plutôt que AddExitProc. La raison est que AddExitProc ne gère pas les méthodes d'objets et ne permet pas de gérer précisément la libération de chaque instance.
Mauvaise utilisation avec objets :
La bonne approche ici serait de libérer explicitement les objets au bon moment, plutôt que d'essayer d'enregistrer un AddExitProc sur des objets.
Ce code garantit que Cleanup sera exécutée sans dépendre de AddExitProc.
Exemple
Dans cet exemple, nous créons une procédure étant appelée lors de la fermeture du programme pour afficher un message et effectuer un nettoyage :
- Program AddExitProcExample;
-
- Uses
- SysUtils;
-
- { Procédure à exécuter avant la fin du programme }
- Procedure CleanUp;Begin
- WriteLn('Nettoyage avant la fermeture du programme...');
- { Vous pouvez ajouter ici des tâches comme fermer des fichiers, libérer des ressources,... }
- End;
-
- BEGIN
- { Ajouter CleanUp à la liste des procédures à exécuter à la fin du programme }
- AddExitProc(@CleanUp);
- WriteLn('Le programme est en cours d''exécution...');
- { Le programme continue son exécution normalement, et CleanUp sera appelé à la fin. }
- END.