Threads

Résolu
cs_valkyrie Messages postés 60 Date d'inscription mardi 27 juillet 2004 Statut Membre Dernière intervention 13 décembre 2004 - 15 oct. 2004 à 05:28
cs_valkyrie Messages postés 60 Date d'inscription mardi 27 juillet 2004 Statut Membre Dernière intervention 13 décembre 2004 - 19 oct. 2004 à 02:55
Bonjour a tout le monde

mon prog plante inelucablement des que je bouge la fenetre pendant son execution ou que je clique sur un autre truc......l execution est assez longue ca dure quelques minutes de calcul...mais pendant ce temps je ne peux meme pas bouger la fenetre, en fait il faudrait rester devant bouche bee....pas marrant

je pense donc a un thread(pas mal deja pour un noob)

l idee c est "si je clique sur quoique ce soit l application continue a fonctionner mais si je clique sur la croix en haut a droite ca kill l application proprement..."
quels sont les proprietes et la demarche a suivre pour le thread(pas trop complique siouple)

(ce mail ne s autodetruit pas)

merci messieurs&dames et bon vent

aimez vous les uns les autres

6 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
18 oct. 2004 à 22:54
Application.ProcessMessages permet de redonner la main au système pour qu'il traite les messages en attente.

"est ce que je peut inclure un thread dans une procedure deja existante" ?
Un thread est un autre process qui s'exécute en parallèle. Il n'est donc pas question de l'inclure dans une procédure existante.
D'ailleurs, Manchester a utilisé une déclaration une classe pour le thread qu'il a utilisé dans son exemple. On crée un thread, on le lance et il fait son bonhomme de chemin tout seul jusqu'à ce qu'il ait fini ou qu'on décide de l'arrêter.

"est ce que un thread qu on a defini a part peu fonctionner dans plusieurs unites independantes?"
En fait, il est préférable de déclarer la classe d'un thread dans une unité à part (voir Fichier/Nouveau/Objet thread). En plus, cela permettra de référence le thread partout où l'on en a besoin sans devoir référence unit1 comme dans le code ci-dessus. Mais attention, si le thread doit mettre à jour des contrôles visuels, il faudra alors lui passer des références en surchargeant un constructeur. Sinon, il redeviendrait dépendant des différentes fiches.

Regarde bien le code que je t'ai indiqué dans une des réponses précédentes et tu verras que l'unité déclarant le thread ne référence pas l'unité contenant la fiche. Ainsi, je peux réutiliser le thread partout où je le souhaite.

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
May Delphi be with you
3
cs_ManChesTer Messages postés 374 Date d'inscription vendredi 20 octobre 2000 Statut Modérateur Dernière intervention 15 janvier 2021
15 oct. 2004 à 19:13
Voici un exemple ....

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TClock = class(Tthread) //On fais une Horloge comme exemple
procedure execute; override;
end;

TForm1 = class(TForm)
BtStart: TButton; // un bouton start
BtStop: TButton; // un bouton stop
procedure BtStartClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDestroy(Sender: TObject);
procedure BtStopClick(Sender: TObject);
private
Clock : Tclock;
public
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

Procedure Tclock.Execute;
begin
While not terminated do // tant que l'on a pas fais appel a Clock.terminate
begin
Form1.Caption:=TimeToStr(Now);
Application.ProcessMessages; // pour laisser s'executer les messages de l'application
end;
end;

procedure TForm1.BtStartClick(Sender: TObject);
begin
Clock:=Tclock.Create(True);
//...
// ici ton code pour initialiser les variables eventuelles de la thread
//...
Clock.execute;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Clock.Terminate; //termine le thread;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
if Clock<>nil then // si clock existe
begin
while not Clock.Terminated do // si il tourne encore
Clock.Terminate; //arrete le encore
Clock.Free; //Efface le thread de la mémoire
end;
end;

procedure TForm1.BtStopClick(Sender: TObject);
begin
If Clock=Nil then exit; // si clock n'est pas crayer, sort
Clock.Terminate; // Termine le thread (arrete)
while not Clock.Terminated do // si il tourne encore
Clock.Terminate; //arrete le encore
Clock.Free; //Efface le thread de la mémoire
end;

end.

Bon Coding ....

ManChesTer.
0
cs_ManChesTer Messages postés 374 Date d'inscription vendredi 20 octobre 2000 Statut Modérateur Dernière intervention 15 janvier 2021
15 oct. 2004 à 20:16
bien, vu, pour

Form1.Caption:=TimeToStr(Now);

valkyrie est censé le virer pour mettre son propre code et mettre

Synchronize(Form1.Laprocedure);

Pour le resume tu a raison, méa culpa, c'est l'habitude de ne plus utiliser delphi pour le thread mais les apis, on perd vite les delphi reflex...

Donc remplacer
Clock.execute;
par
Clock.Resume;

Beurkkk .net, c pas pour moi, ca... il y a quelques temps, un client m'a demander un site, j'ai ecrit un serveur HTTP POP et SMTP sur mesure, au moins je suis sur qu'il ne seras pas piraté.... ;)

Bon Coding ....

ManChesTer.
0
cs_valkyrie Messages postés 60 Date d'inscription mardi 27 juillet 2004 Statut Membre Dernière intervention 13 décembre 2004
18 oct. 2004 à 04:11
ahhhhh pardon
c est quoi application.processmessage?
aimez vous les uns les autres
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_valkyrie Messages postés 60 Date d'inscription mardi 27 juillet 2004 Statut Membre Dernière intervention 13 décembre 2004
18 oct. 2004 à 05:11
il y a un autre truc
est ce que je peut inclure un thread dans une procedure deja existante ou est ce qu il faut que je retape tout...en fait est ce que un thread qu on a defini a part peu fonctionner dans plusieurs unites independantes?
aimez vous les uns les autres
0
cs_valkyrie Messages postés 60 Date d'inscription mardi 27 juillet 2004 Statut Membre Dernière intervention 13 décembre 2004
19 oct. 2004 à 02:55
OK MERCI DELPHIPROG!
aimez vous les uns les autres
0
Rejoignez-nous