PatSW
Messages postés24Date d'inscriptionsamedi 28 décembre 2002StatutMembreDernière intervention 1 février 2005
-
26 oct. 2003 à 14:50
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 2013
-
26 oct. 2003 à 22:17
J'aimerais savoir comment faire une appli qui executre une boucle en tread et ui ne se ferme pas.
ex:
program Project1;
uses
Classes,Windows;
var P: TPoint;
begin
while true do GetCursorPos(P);
end.
Le programme ne ferme pas mais si je met ceci:
program Project1;
uses
Classes,Windows;
var T: MyThread; //thread contenant la boucle
begin
T:=MyThread.Execute(True);
T.Priority:=tpNormal;
T.FreeOnTerminate:=True;
T.Resume;
end.
Ici le programe ferme des quil est ouvert,
mais si je rajoute ShowMessage('') a la derniere ligne (apres le T.Resume) le thread est executer jusqua ce que je ferme la boite de msg...
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 26 oct. 2003 à 22:17
Le problème ici, c'est que le programme principal crée un Thread, le lance et se termine sans prendre soin de le détruire à la fermeture.
Je rappelle aussi que le constructeur Create des treads admet un argument pour savoir si le thread doit démarrer tout de suite ou se mettre en attente (CreateSuspended).
Je rappelle ausi que la méthode Execute est déclarée protected à l'origine de façon à ce qu'aucun processus ne puisse le lancer directement sans passer par un appel au constructeur. La méthode Execute n'a pas le même sens que celui d'une boite de dialogue prédéfinie.
Avant de fermer le programme principal, il serait bon de tester la valeur de la propriété Terminated du thread et de déterminer la conduite à tenir : si le thread lancé n'est pas terminé, faut-il l'arrêter et le "tuer" ou attendre qu'il ait fini ?
Si tu nous disais ce que tu comptes faire avec, on pourrait mieux t'aider.
Rappelle-toi qu'un thread n'a pas de propriétaire déclaré et que si tu fermes le processus qu'il l'a lancé, il va errer en mémoire s'il n'est pas prévu qu'il s'auto-détruise.
Selon ce que tu fais, tu peux voir faire fondre tes ressources mémoire sans autre issue que de redémarrer ta machine.
Windows n'a pas vraiment besoin de celà, il le fait déjà tout seul ! :-p
May Delphi be with you