1. #1
    Membre habitué

    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : août 2002
    Messages : 58
    Points : 161
    Points
    161

    Par défaut CreateProcess à l'intérieur d'un thread

    Bonjour,

    Contexte :
    J'ai besoin d'utiliser un utilitaire (mailsend.exe) pour envoyer des emails, mais sans bloquer l'application.
    J'utilise CreateProcess avec un TimeOut pour éviter d'avoir à programmer une temporisation pour tuer le processus.
    Important (!) : Delphi 5


    J'ai un problème avec CreateProcess quand je l'exécute à l'intérieur d'un thread.
    Le code ci-dessous fonctionnait sans problème à l'extérieur.

    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
    constructor TThreadMail.Create(CreateSuspended: Boolean);
    begin
      inherited Create(CreateSuspended);
      FreeOnTerminate := true;
      Priority := tpNormal;
    end;
     
    procedure TThreadMail.Execute;
    var
      options, fic : string;
      StartInfo : TStartupInfo;
      ProcInfo : TProcessInformation;
      CreateOK : Boolean;
      prog	: string;
      timeout : integer;
    begin
      options := '...';
      timeout := 5000;
      prog := CHEMIN + 'mailsend.exe' + options;
      UniqueString(prog);
      FillChar(StartInfo,SizeOf(TStartupInfo),#0);
      FillChar(ProcInfo,SizeOf(TProcessInformation),#0);
      StartInfo.cb := SizeOf(TStartupInfo);
      //ProcInfo.hThread := Handle;
      CreateOK := CreateProcess(nil, PChar(prog), 
                  nil, nil,False,
                  DETACHED_PROCESS,
                  nil, nil, StartInfo, ProcInfo);
      try
        if CreateOK then begin   // <==== TOUJOURS FAUX !!!
          if timeout > 0 then WaitForSingleObject(ProcInfo.hProcess, timeout); // INFINITE);
        end;
      finally
        CloseHandle(ProcInfo.hProcess);
        CloseHandle(ProcInfo.hThread);
      end;
    end;
     
    // ---------
    // in DataModule 
    begin  
      ...
      with TThreadMail.Create(TRUE) do begin
        FreeOnTerminate := TRUE; 
        Priority := tpNormal;
        // exécution
        Resume; 
      end;
      ...
    end;

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Profil pro
    Inscrit en
    septembre 2008
    Messages
    4 436
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : septembre 2008
    Messages : 4 436
    Points : 9 035
    Points
    9 035

    Par défaut

    Que renvoie GetLastError ?

    Par précaution, il faudrait au moins ajouter des guillemets sur le chemin/fichier.

  3. #3
    Membre habitué

    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : août 2002
    Messages : 58
    Points : 161
    Points
    161

    Par défaut

    Citation Envoyé par Andnotor Voir le message
    Que renvoie GetLastError ?
    193

    Par précaution, il faudrait au moins ajouter des guillemets sur le chemin/fichier.
    Corrigé, mais aucune incidence.

  4. #4
    Membre habitué

    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : août 2002
    Messages : 58
    Points : 161
    Points
    161

    Par défaut

    Le problème était lié à la version Windows XP de la machine virtuelle.
    Pas de problème sous Seven.

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

Discussions similaires

  1. Exécuter un .exe à l'intérieur d'un thread
    Par funboard dans le forum Général Java
    Réponses: 3
    Dernier message: 10/01/2013, 10h56
  2. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 10h00
  3. Réponses: 6
    Dernier message: 03/03/2004, 15h31
  4. savoir si 1 point est a l'intérieur d'un cercle ...
    Par skarladevobsy dans le forum Général Algorithmique
    Réponses: 15
    Dernier message: 23/05/2002, 19h14
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 14h53

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