IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Tester si un process est actif et l'arrêter [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de sematimo
    Profil pro
    Inscrit en
    Février 2009
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 332
    Par défaut Tester si un process est actif et l'arrêter
    Bonjour à tous,

    Je voudrais savoir comment tester si un process est actif et si oui comment l'arrêter.

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 933
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 933
    Par défaut
    Sous Windows, ça passe par l'énumération des processus, la récupération de la tâche principale (la première trouvée) du(des) processus souhaité(s) et une demande d'arrêt de cette tâche par WM_QUIT qui nous fait sortir proprement de sa boucle de messages.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    procedure KillProcesses(aFileName: string);
    var
      Handle  :THandle;
      Process :TProcessEntry32;
      Thread  :TThreadEntry32;
     
    begin
      aFileName := ExtractFileName(aFileName);
     
      Process.dwSize := SizeOf(TProcessEntry32);
      Thread.dwSize  := SizeOf(TThreadEntry32);
     
      Handle := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS or TH32CS_SNAPTHREAD, 0);
     
      if Handle <> INVALID_HANDLE_VALUE then
      try
        // Enumération des processus
        if Process32First(Handle, Process) then
        repeat
          // Trouvé ?
          if not SameText(Process.szExeFile, aFileName) then Continue;
     
          // Enumération des tâches
          if Thread32First(Handle, Thread) then
          repeat
            // Est-ce qu'elle appartient au processus ?
            if Thread.th32OwnerProcessID <> Process.th32ProcessID then Continue;
     
            // Arrêt propre de la tâche
            PostThreadMessage(Thread.th32ThreadID, WM_QUIT, 0, 0);
     
            // On peut s'arrêter là puisque la première trouvée est la principale
            Break;
     
          until not Thread32Next(Handle, Thread);
     
        until not Process32Next(Handle, Process);
     
      finally
        CloseHandle(Handle);
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      KillProcesses('notepad.exe');
    end;
    Evidemment si l'application est lancée plusieurs fois, toutes les instances seront terminées. Si on voulait cibler spécifiquement un processus lancé par notre application, on pourrait soit compléter le test en contrôlant le processus parent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Trouvé ?
    if not SameText(Process.szExeFile, aFileName) or (Process.th32ParentProcessID <> GetCurrentProcessID) then Continue;
    soit récupérer et stocker le ProcessID après ShellExecuteEx ce qui nous éviterait la boucle TH32CS_SNAPPROCESS.




    Sous Linux... aucune idée

  3. #3
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 221
    Par défaut
    Hello,
    en python c'est plus facile et en plus c'est multi-plateforme avec le module psutil :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import psutil
     
    PROC_NAME = "abc.exe"
     
    for proc in psutil.process_iter():
        # check whether the process to kill name matches
        if proc.name() == PROC_NAME:
            proc.kill()
    #

    A noter que l'on peut utiliser du python dans lazarus avec le package pythonForLazarus présent dans le Online Package Manager mais il faut qu'il y ait au moins une version embarquée de python installée dans l'O.S.

    Ami calmant, J.P

  4. #4
    Membre éclairé
    Avatar de sematimo
    Profil pro
    Inscrit en
    Février 2009
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 332
    Par défaut
    Bonjour

    J'ai testé mais message erreur Handle :THandle , avec Windows dans uses.

    Voilà mon problème, j'ai des pages de lecture enregistrées que je sélectionne dans une liste et j'ai un process pour écouter la page sélectionnée avec wmplayer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure Tform1.ProcExec(title: string);
    begin
    AProcess := TProcess.Create(nil);
     AProcess.Executable:= 'c:\Program Files\Windows Media Player\wmplayer.exe';
    AProcess.Parameters.Add(title);
     AProcess.ShowWindow:=swoHIDE;
      aprocess.Execute;
      aprocess.Free;
    end;
    Je veux pouvoir lancer une autre page même si la première n'est pas lue entièrement.
    Jusque là pas de problème, je relance le process avec la nouvelle page et elle est lue.
    Mais je voudrais que lorsque je quitte l'application, le process s'arrête, que wmplayer soit fermé.

    J'ai essayé ça mais rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
           AProcess.Executable := 'c:\windows\system32\cmd.exe';
        AProcess.Parameters.Add('/c');
        AProcess.Parameters.Add('Taskkill /IM C:\Program Files\Windows Media Player\wmplayer.exe /F');
            AProcess.Execute;

  5. #5
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Citation Envoyé par sematimo Voir le message
    j'ai testé mais message erreur Handle :THandle , avec windows dans uses
    C'est quoi exactement le message d'erreur, parce que là, franchement...

  6. #6
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 221
    Par défaut
    Hello,
    on peut aussi commander windows media player en utilisant son objet COM.
    Voici un petit projet (en pièce jointe) qui ouvre un mp3 ou une liste de lecture m3u et qui lit le fichier chargé dans windows media player.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    unit Unit1;
    {$mode objfpc}{$H+}
    interface
    uses
      Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,
      EditBtn;
     
    type
      { TForm1 }
      TForm1 = class(TForm)
        Bt_Play: TButton;
        Bt_Stop: TButton;
        Button3: TButton;
        Fichier: TFileNameEdit;
        Memo1: TMemo;
        procedure Bt_PlayClick(Sender: TObject);
        procedure Bt_StopClick(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure FichierChange(Sender: TObject);
        procedure FormCreate(Sender: TObject);
     
      private
     
      public
     
      end;
     
    var
      Form1: TForm1;
     
    implementation
     uses comobj;
     
     var player: olevariant;
     
    {$R *.lfm}
     
    { TForm1 }
     
    procedure TForm1.Bt_PlayClick(Sender: TObject);
    var
      i : integer;
      ext: string;
      Fic : String;
     begin
        player.controls.play;
        bt_Play.Enabled := False;
        bt_Stop.Enabled := True;
    end;
     
     
    procedure TForm1.Bt_StopClick(Sender: TObject);
    begin
       player.controls.stop;
       bt_Stop.Enabled := False;
       bt_Play.Enabled := True;
    end;
     
     
    procedure TForm1.Button3Click(Sender: TObject);
    begin
      Memo1.Clear;
    end;
     
    procedure TForm1.FichierChange(Sender: TObject);
    var i: integer;
    var ext: String;
    begin
      player.controls.stop;
      bt_Play.Enabled := True;
      ext :=  ExtractFileExt(Fichier.FileName);
      player.url:=olevariant(Fichier.FileName);
      player.controls.stop;
      If ext = '.m3u' then
         begin
          Memo1.Append('Nom de la liste de lecture : ' + player.currentPlaylist.Name);
          Memo1.Append('Nombre de morceaux : '  + inttostr(player.currentPlaylist.count));
         end;
      For i := 0 To player.currentPlaylist.Count - 1  do
         begin
          Memo1.Append(player.currentPlaylist.Item(i).Name);
         end;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
          player:=CreateOleObject('Wmplayer.OCX.7');
    end;
     
    end.
    Nom : LazWMP.PNG
Affichages : 671
Taille : 15,5 Ko

    Ami calmant (J.P sans T)
    Fichiers attachés Fichiers attachés

  7. #7
    Membre éclairé
    Avatar de sematimo
    Profil pro
    Inscrit en
    Février 2009
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 332
    Par défaut
    Le message :
    unit1.pas(141,3) Error: Duplicate identifier "Handle"
    alors que je n'utilse handle que dans la fonction de Andnotor.

    J'ai lazarus 2.2.2. FPC 3.2.2.

    Autre truc, je fais une recherche avec FindFist et depuis que j'ai ajouté Windows dans les uses j'ai un message d'erreur :
    unit1.pas(389,19) Error: Incompatible type for arg no. 1: Got "TRawbyteSearchRec", expected "QWord"
    Si j'enlève Windows des uses ce message disparaît.

    J'ai testé le source de jurassic pork en enlevant le pack Python et modifiant '.m3u' en '.mp3'.

  8. #8
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 166
    Billets dans le blog
    9
    Par défaut
    Bonjour !

    Vous pourriez remplacer Handle par Handle1 et FindFirst par SysUtils.FindFirst.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tester si le scroll est actif
    Par RollinGStaR95 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 18/08/2024, 00h37
  2. [WD20] Tester si un ActiveX est actif
    Par Romanops dans le forum WinDev
    Réponses: 4
    Dernier message: 25/05/2016, 10h50
  3. [MySQL] Tester si InnoDB est actif
    Par stix74 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 02/01/2009, 14h19
  4. Vérifier si un process est actif
    Par Olivier Regnier dans le forum Linux
    Réponses: 3
    Dernier message: 10/03/2007, 01h38
  5. Tester si un process est encore actif
    Par Damien2212 dans le forum Windows
    Réponses: 2
    Dernier message: 17/09/2004, 15h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo