Boucle " repeat until " qui freeze mon exe [Résolu]

Signaler
Messages postés
2
Date d'inscription
mardi 31 août 2004
Statut
Membre
Dernière intervention
30 janvier 2008
-
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
-
Bonjour,
j'ai une petite procédure qui permet de détecter lorsque un programme défini est lancé.
Lorsqu'un checkbox est coché, la procédure surveille tous les processus en cours d'éxecution et les compare un à un via le contenu d'un editbox.
Le problème est que lorsque la boucle est éxecuté, mon application se gèle completement et je ne peux rien faire jusqu'a ce que l'application cible soit éxecuté.
Si quelqu'un sait comment faire pour que ma boucle ne bloque pas mon programme ... ^^

procedure TForm1.CheckBox1Click(Sender: TObject);
var
TheTarget: String;
SnapShot: Cardinal;
ProcessEntry: TProcessEntry32;
begin

if Checkbox1.Checked = False then exit;

repeat

//Création de "l'instantané"
SnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
//En cas d'erreur on sort
If SnapShot = 0 then Exit;

ProcessEntry.dwSize := SizeOf(ProcessEntry);

//Lecture du premier processus de la liste
If Process32First(SnapShot, ProcessEntry) then
//Tant qu'il reste un processus, ajouter son nom à la liste
while Process32Next(SnapShot, ProcessEntry) do
begin
TheTarget := ProcessEntry.szExeFile; //On récupère dans la variable le nom d'un des processus en cours
if TheTarget = Edit1.Text then //Si ce processus est celui recherché, on entre dans la boucle
begin
Showmessage('Le processus ' + Edit1.Text + ' a été lancé.');
Checkbox1.Checked := False;
Exit;
end;
end;

//Libération de l'instantané
CloseHandle(SnapShot);

Sleep(50);

until TheTarget = Edit1.Text;

end;

4 réponses

Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
De tete parce que j'ai pas Delphi : Application.ProcessMessage ( ca bloque plus mais c vachement plus lent ! )

Ou alors tu passe par un Thread ( ya un tuto de GrandVizir bien fait sur ce sujet )

Ciao
Messages postés
2
Date d'inscription
mardi 31 août 2004
Statut
Membre
Dernière intervention
30 janvier 2008

Oula, petit problèem d'édition ^^''''
J'espere que ce sera mieux cette fois :

( Reprise du message précedent )

Bonjour, j'ai une petite procédure qui permet de détecter lorsque un programme défini est lancé.
Lorsqu'un checkbox est coché, la procédure surveille tous les processus en cours d'éxecution et les compare un à un via le contenu d'un editbox.
Le problème est que lorsque la boucle est éxecuté, mon application se gèle completement et je ne peux rien faire jusqu'a ce que l'application cible soit éxecuté.
Si quelqu'un sait comment faire pour que ma boucle ne bloque pas mon programme ...

procedure TForm1.CheckBox1Click(Sender: TObject);
var
  TheTarget: String;
  SnapShot: Cardinal;
  ProcessEntry: TProcessEntry32;
begin


  if Checkbox1.Checked = False then exit;


    repeat


  //Création de "l'instantané"
  SnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  //En cas d'erreur on sort
  If SnapShot = 0 then Exit;


  ProcessEntry.dwSize := SizeOf(ProcessEntry);


  //Lecture du premier processus de la liste
  If Process32First(SnapShot, ProcessEntry) then
    //Tant qu'il reste un processus, ajouter son nom à la liste
    while Process32Next(SnapShot, ProcessEntry) do
      begin
       TheTarget := ProcessEntry.szExeFile;   //On récupère dans la variable le nom d'un des processus en cours
        if TheTarget = Edit1.Text then        //Si ce processus est celui recherché, on entre dans la boucle
          begin
            Showmessage('Le processus ' + Edit1.Text + ' a été lancé.');
            Checkbox1.Checked := False;
            Exit;
          end;
      end;


  //Libération de l'instantané
  CloseHandle(SnapShot);


  Sleep(50);


    until TheTarget = Edit1.Text;


end;

désolé si l'affichage ne passe pas :/
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
euh dsl ...  Application.ProcessMessage est bien sur a mettre dans ta boucle

et prq met tu un sleep(50) dans ta boucle ?
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
regarde un peu au niveau des sources qui font la même chose y'en a des trés bonnes.