Boucle " repeat until " qui freeze mon exe

Résolu
ArKaLiTy Messages postés 2 Date d'inscription mardi 31 août 2004 Statut Membre Dernière intervention 30 janvier 2008 - 30 janv. 2008 à 15:02
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 30 janv. 2008 à 17:47
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

Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
30 janv. 2008 à 16:00
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
ArKaLiTy Messages postés 2 Date d'inscription mardi 31 août 2004 Statut Membre Dernière intervention 30 janvier 2008
30 janv. 2008 à 15:08
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 :/
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
30 janv. 2008 à 16:01
euh dsl ...  Application.ProcessMessage est bien sur a mettre dans ta boucle

et prq met tu un sleep(50) dans ta boucle ?
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 34
30 janv. 2008 à 17:47
regarde un peu au niveau des sources qui font la même chose y'en a des trés bonnes.


Rejoignez-nous