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

C++Builder Discussion :

Arrêter mon programme si un autre s'arrête


Sujet :

C++Builder

  1. #1
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut Arrêter mon programme si un autre s'arrête
    Bonjour à tous,

    J'ai une application Access qui un processus depuis une DLL. De temps en temps, mon application Access s'arrête par plantage sans arrêter le processus.

    Avez-vous une idée pour que mon processus teste régulièrement si l'application Access tourne toujours et se suicide si ce n'est pas le cas? je pensais transmettre le handle de l'application Access au processus mais je ne sais pas comment faire le test du côté du processus.

    Merci par avance

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par défaut
    Hello,

    A partir du handle de ta fenêtre, un GetWindowThreadProcessId te ramène l'ID du process, puis un WaitForSingleObject sur le handle du process trouvé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      DWORD pID;
      if (!GetWindowThreadProcessId(hwnd, &pID) != NULL)
        RaiseLastOSError();
     
      HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
      if (h==NULL)
        RaiseLastOSError();
     
      int res = WaitForSingleObject(h, INFINITE);
      CloseHandle(h);
    Le genre de chose à faire tourner dans un thread (dans ce cas prévoir un WaitForMultipleObjects comme ici - voir la fonction ProcessFilenameChanges et l'utilisation de fBreakEvent).

    Bon courage !

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    Salut Totoche76,

    Merci beaucoup, je vais essayer tout de suite!

    Bonne journée

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    Voilà, j'ai dû changer les droits requis à "SYNCHRONIZE" car la fonction échouait avec "PROCESS_ALL_ACCESS":

    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
     
      if (GetParentPID()) {
        // Try to open the parent process
        HANDLE h = OpenProcess(SYNCHRONIZE ,
                               FALSE,
                               GetParentPID());
        if (h==NULL) {
          cerr<<"Can't find parent process "<<GetParentPID()<<endl;
          // Unable to open it: it probably has stopped
          Application->Terminate();
        } else {
          // Process was successfully opened, so it exist :-)
          //int res = WaitForSingleObject(h, INFINITE);
          // Close the handle we received
          CloseHandle(h);
        }
      }
    J'ai enlevé le WaitForSingleObject() car je ne comprends pas vraiment son utilité et il me semble qu'il bloquait parfois l'exécution du programme.

    Encore merci pour l'aide

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 23/05/2011, 10h53
  2. Réponses: 5
    Dernier message: 29/12/2007, 00h03
  3. Réponses: 3
    Dernier message: 27/04/2007, 19h39
  4. Réponses: 2
    Dernier message: 02/12/2006, 20h13
  5. Mon programme empêche l'arrêt de Windows
    Par forzalec dans le forum C++Builder
    Réponses: 4
    Dernier message: 16/11/2006, 14h27

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