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

 Delphi Discussion :

Kill ffmpeg après traitement Win 11 64 bits et D6


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 582
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 582
    Par défaut Kill ffmpeg après traitement Win 11 64 bits et D6
    Bonjour à toutes et à tous,

    J'utilise ffmpeg dans une ressource et quand je quitte l'application sans avoir effectué un traitement, je sais l'effacer sans le Kill.

    Mais si j'ai fait un traitement je ne sais plus l'effacer malgré l'ajout d'un Kill et donc il reste dans le dossier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure TU_F.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
     //kill -STOP <pid>
     
     ShellExecute(0,'open',pchar('taskkill /f /im FFmpeg.exe'),nil,nil,SW_SHOW);
     
     //Application.ProcessMessages;
     
     if fileexists(chappli + 'ffmpeg.exe') then
     deletefile(chappli + 'ffmpeg.exe') else
        showmessage('Une erreur est survenue lors de la fermeture');
    end;
    Merci si un membre a une autre idée.

    @+,

    cincap

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 582
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 582
    Par défaut
    @ tous désolé, j'ai trouvé une autre approche avec une fonction.

    @+,

    cincap

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    Citation Envoyé par cincap Voir le message
    @ tous désolé, j'ai trouvé une autre approche avec une fonction.

    @+,

    cincap
    Cela aurait été sympathique de partager la solution trouvée !


    Il est possible de générer un BAT
    Le BAT fait le KILL, DEL ffmpeg.exe et même DEL BAT (oui il peut s'auto-supprimer), en voici le principe pour un système d'auto update (que j'utilise encore)



    Sinon une boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    I := 0;
    while FileExists(chappli + 'ffmpeg.exe') and (I < 100) do
    begin
      if not DeleteFile(chappli + 'ffmpeg.exe') then
        Sleep(10);
     
      Inc(I);
    end;
    A la place du ShellExecute, faudrait un ShellExecuteEx ou même un CreateProcess (plus délicat) pour gérer un WaitFor sur le Handle tant que la commande KILL est en éxécution en attendre qu'elle est fini de terminer le processus FFmpeg.exe

    D'ailleurs vous devez déjà connaitre CreateProcess puisque vous l'avez utilisé dans votre fonction ExeAndWait.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 582
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 582
    Par défaut
    @ ShaiLeTroll, bonjour, merci pour l'info, voici la fonction mais après usage cela fonctionne que si un premier traitement, si de suite après le 1er j'effectue un deuxième ffmpeg est repris deux fois avec un autre pid.

    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
     
    function KillProcess(const ProcessName : string) : boolean; 
    var ProcessEntry32 : TProcessEntry32;
        HSnapShot : THandle; 
        HProcess : THandle; 
    begin 
      Result := False; 
     
      HSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
      if HSnapShot = 0 then exit; 
     
      ProcessEntry32.dwSize := sizeof(ProcessEntry32); 
      if Process32First(HSnapShot, ProcessEntry32) then 
      repeat 
        if CompareText(ProcessEntry32.szExeFile, ProcessName) = 0 then 
        begin 
          HProcess := OpenProcess(PROCESS_TERMINATE, False, ProcessEntry32.th32ProcessID); 
          if HProcess <> 0 then 
          begin 
            Result := TerminateProcess(HProcess, 0); 
            CloseHandle(HProcess); 
          end; 
          Break; 
        end; 
      until not Process32Next(HSnapShot, ProcessEntry32); 
     
      CloseHandle(HSnapshot); 
    end;
    Usage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    KillProcess('ffmpeg.exe');
    Je vais tester ta solution.

    @+,

    cincap

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 582
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 582
    Par défaut
    @ ShaiLeTroll, ta solution ne fonctionne pas alors j'utilise un fichier .bat et cela fonctionne même après 3 traitements avec ffmpeg.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ShellExecute(0,'open',pchar('Kil FFmpeg.bat'),nil,nil,SW_SHOW);
    Merci,

    @+,

    cincap

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 582
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 582
    Par défaut
    @ tous,

    Je confirme avec la commande en fichier batch cela fonctionne.

    Ma question : alors pourquoi en reprenant exactement le code et l'exécuter depuis l'application Delphi cela ne fonctionne pas ?
    @+,

    cincap

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 582
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 582
    Par défaut
    @ tous,

    J'ai modifié l'exécution du Kill et ensuite rajouter une pause entre le Kill et le delete et tout fonctionne.

    @+,

    cincap

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    Citation Envoyé par cincap Voir le message
    @ tous,

    J'ai modifié l'exécution du Kill et ensuite rajouter une pause entre le Kill et le delete et tout fonctionne.

    @+,

    cincap
    Soit ce que j'avais proposé avec la boucle contenant le Sleep dans ma première réponse



    Citation Envoyé par cincap Voir le message
    @ ShaiLeTroll, ta solution ne fonctionne pas alors j'utilise un fichier .bat et cela fonctionne même après 3 traitements avec ffmpeg.
    Citation Envoyé par cincap Voir le message
    Je confirme avec la commande en fichier batch cela fonctionne.
    Ma question : alors pourquoi en reprenant exactement le code et l'exécuter depuis l'application Delphi cela ne fonctionne pas ?
    J'ai remarqué surtout avec CITRIX que certaines opérations comme DEL dans un BAT était plus efficace qu'un DeleteFile en Delphi, le fichier étant verrouillé temporairement

    Attention, je parlais d'un BAT plus riche que la simple commande, en fait ton programme va se terminer SANS attendre la suppression, c'est le BAT qui va le faire dans un autre processus.

    Code BAT : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    taskkill /f /im FFmpeg.exe
     
    :LoopDelete
    DEL "FFmpeg.exe"
    IF EXIST "FFmpeg.exe" GOTO LoopDelete
     
    DEL Kill_FFmpeg.bat

    Pour générer le BAT et le lancer
    Attention, écrit directement sur le forum, cela peut être plus de faute sans parler si D7 ça peut être différent.

    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
     
    procedure KillProcessAndDelete(const AProcessName: string);
    var
      BatName: string;
      BatOp: TStringList;
      DosStr: array of AnsiChar;
    begin
      BatName := 'KILL_' + ChangeFileExt(AProcessName, '.bat');
      BatOp := TStringList.Create();
      try
        BatOp.Add(Format('taskkill /f /im %s', [AProcessName]));
        BatOp.Add(':LoopDelete');
        BatOp.Add(Format('DEL "%s"', [AProcessName]));
        BatOp.Add(Format('IF EXIST "%s" GOTO LoopDelete', [AProcessName]));
        BatOp.Add(Format('DEL "%s"', [BatName]));
     
        // Unicode to DOS OEM
        SetLength(DosStr, Length(BatOp.Text)+1);
        if CharToOem(PChar(BatOp.Text), @DosStr[0]) then
          BatOp.Text := string(PAnsiChar(@DosStr[0]));
        BatOp.SaveToFile(BatName);
     
        // Lancement du .BAT
        ShellExecute(0, 'open', PChar(BatName), nil, nil, SW_HIDE);
      finally
        BatOp.Free();
      end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 582
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 582
    Par défaut
    Bonjour à toutes et à tous,

    @ ShaiLeTroll, merci pour tes précieux conseils, j'en prend note.

    Ce topic peut être fermé.

    @+,

    cincap

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/04/2007, 08h18
  2. Réponses: 8
    Dernier message: 01/02/2007, 10h58
  3. Réponses: 5
    Dernier message: 08/01/2007, 14h58
  4. Réponses: 5
    Dernier message: 20/10/2006, 15h26
  5. libération de la mémoire après traitement ?
    Par isachat666 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 07/12/2005, 19h29

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