Thread sans form

PatSW Messages postés 24 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 1 février 2005 - 26 oct. 2003 à 14:50
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Derniè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...

Merci

The Universal ßð¥

2 réponses

yvemoreau Messages postés 308 Date d'inscription mardi 11 juin 2002 Statut Membre Dernière intervention 26 septembre 2008
26 oct. 2003 à 19:57
que doit-faire la boucle exactement ?

faire un programme qui ne fait rien ,c'est pas très utile ...

sinon enlève le T.resume;

????

type
MyThread = class(TThread)
procedure Execute; override;
public
constructor Create();
end;

implementation

procedure MyThread.Execute;
begin
????????????????????
end;

constructor MyThread.Create;
begin
FreeOnTerminate := True;
inherited Create(false);
Priority := tpHighest ;// Normal;// // tpLowest ;//tpIdle
end;

yve
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
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
0
Rejoignez-nous