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 :

[Débutant] Créate Process / Mutex


Sujet :

Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 158
    Points : 158
    Points
    158
    Par défaut [Débutant] Créate Process / Mutex
    Bonjour,

    J'ai deux programmes (Delphi). Un programme B qui est un batch et qui a au début de son code les lignes suivantes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
      SetLastError(NO_ERROR);
      CreateMutex (nil, False, 'Programme_B');
      if GetLastError = ERROR_ALREADY_EXISTS    then Exit;
    qui évitent que l'on puisse le lancer une seconde fois, si une instance de ce programme a déja été lancée.

    Je dois effectuer un programme A de type console qui puisse en autre executer manuellement ce programme B, afin de réaliser cette fonction j'ai codé les lignes suivantes

    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
     
     
    function LancementDuProgramme_B:integer;
     
    var
      StartInfo: TStartupInfo;
      ProcessInfo: TProcessInformation;
      vl_CodeRetour: dword;
      vl_batch: string;
     
    begin
      result:=-1;
      { Mise à zéro de la structure StartInfo }
      FillChar(StartInfo, SizeOf(StartInfo), #0);
      { Seule la taille est renseignée, toutes les autres options }
      { laissées à zéro prendront les valeurs par défaut }
      StartInfo.cb := SizeOf(StartInfo);
     
      vl_batch := 'c:\emplacement_du_prog_B\Programme_B';
     
      { Lancement de la ligne de commande }
      if CreateProcess(nil, Pchar(vl_param), nil, nil, False,
     
        0, nil, nil, StartInfo, ProcessInfo) then
      begin
        { L'application est bien lancée, on va en attendre la fin }
        { ProcessInfo.hProcess contient le handle du process principal de l'application }
     
        WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
     
        GetExitCodeProcess(ProcessInfo.hProcess, vl_CodeRetour); 
     
     //   MessageDlg('Le code retour du programme_B est ' +     //inttostr(vl_CodeRetour, mtWarning, [mbOK], 0);
     
        result:=CodeRetour;
     
      end
      else
        RaiseLastOSError;
    end;
    Ma Question : En procédant de cette manière , il m'a été impossible de lancer le programme B, ou plutôt je me suis rendu compte que la gestion du
    mutex dans le programme B qui fonctionne correctement lorsque le batch est lancé en lançant son propre exe, ne fonctionnait plus lorsque ce même
    programme était lancé par un create process du programme A.

    Mes compétences étant limitées sur ce sujet, avez vous une explication sur le
    problème que je rencontre ?

    Pour contourner ce problème, j'ai du dans le programme B supprimer la gestion du mutex. (Résultat : Mon prog A peut bien lancer le prog B et récupérer son code retour, mais le lancement unique du programme B n"est plus assuré)

    En vous remerciant.

    A+










    ---------------------------------------------------------------------
    Ma config * Delphi 7.1 Entreprise / SQL Serveur 2000 / Windows 2000
    Pitango
    -------------------------------------------------
    [Delphi7.1 Entreprise][MYSQL 5.0.27][SQL SERVER 7][W2000/NT4]

  2. #2
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Bonjour deux processus, même s'il s'agit de 2 instances d'une même application, ne peuvent pas partagé des données. Ils n'ont pas le même espace mémoire.

    Ainsi la variable du mutex du programme B est initialisé lors du lancement une première fois du programme B. Mais quand tu relances le programme B, cette varaible n'est pas initialisé.

    Pour résoudre ça, on utilise les mutex nommé, avec un nom.

    Il me semble qu'il y a un tuto dans la FAQ sur le sujet.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 158
    Points : 158
    Points
    158
    Par défaut
    Bonjour,

    Merci pour ta réponse Caine

    Je consulte la FAQ et je te tiens au courant.

    A+
    Pitango
    -------------------------------------------------
    [Delphi7.1 Entreprise][MYSQL 5.0.27][SQL SERVER 7][W2000/NT4]

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 158
    Points : 158
    Points
    158
    Par défaut
    Après lecture du tutoriel et et grace ta réponse sur les mutex nommés.

    J'ai modifié dans mon programme B le nom du mutex.(En ne mettant plus le nom du .exe de mon programme)

    Car lorsque je créais un process depuis mon programme A pour lancer le programme B

    Le createmutex du programme B

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       CreateMutex (nil, False, 'Programme_B');
    ramenait une erreur et la condition

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GetLastError = ERROR_ALREADY_EXISTS
    était vérifiée.

    j'ai donc modifié la création du mutex par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CreateMutex(nil, False, 'Mutex_Programme_B');
    et tout est rentré dans l'odre.

    Je ne peux pas lancer 2x le programme B en executant manuellement le .exe.

    Et je peux également le lancer à partir de mon programme A par un createprocess.

    Pitango
    -------------------------------------------------
    [Delphi7.1 Entreprise][MYSQL 5.0.27][SQL SERVER 7][W2000/NT4]

  5. #5
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Oui, de manière générale il vaut mieux donner comme nom autre chose que le nom du programme.

    Je pense que le TApplication de borland, ou peut être windows crée un mutex avec le nom de l'application.

    A vérifier.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 158
    Points : 158
    Points
    158
    Par défaut
    OK , je te remercie

    A+
    Pitango
    -------------------------------------------------
    [Delphi7.1 Entreprise][MYSQL 5.0.27][SQL SERVER 7][W2000/NT4]

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/06/2009, 01h33
  2. Réponses: 10
    Dernier message: 03/04/2008, 15h58
  3. Réponses: 3
    Dernier message: 27/09/2007, 13h55
  4. Réponses: 1
    Dernier message: 26/06/2007, 09h35
  5. [Débutant] Empêcher un process d'être "iconisé"
    Par kelebrindae dans le forum MFC
    Réponses: 10
    Dernier message: 03/03/2005, 14h50

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