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

MFC Discussion :

temps execution CreateProcess


Sujet :

MFC

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 10
    Points : 6
    Points
    6
    Par défaut temps execution CreateProcess
    Bonjour

    Je suis en train de réaliser une application graphique en visual c++ et j'ai un probleme avec la fonction CreateProcess.

    Mon application graphique crée un process fils CreateProcess(....) et j'attends la fin du process avec WaitForSingleObject(....).
    Avant le CreateProcess() j'ai un atexit(endProcess), endProcess() avec PostThreadMessage et TerminateProcess (au cas ou), qui gere la fin du thread pere. (Voir http://www.developpez.net/forums/viewtopic.php?t=321740 )

    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
     
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
     
    void fct(){
     
    atexit(endProcess);
     
    //endroit je reste bloqué si l'utilisateur ferme la fenetre 
    CreateProcess( NULL,	(LPSTR)(buffer.c_str()), NULL,  NULL,	FALSE, 
    CREATE_NO_WINDOW, NULL,	NULL, &si, &pi);				     
     
    //arrivé ici plus de probleme
     
    WaitForSingleObject( pi.hProcess, INFINITE );
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
     
    }
     
    void endProcess{ 
     
    if(pi.hProcess!=NULL){
    PostThreadMessage(pi.dwThreadId, WM_CLOSE, 0, 0);
    if ( GetLastError() == ERROR_INVALID_THREAD_ID ) return;// The thread is gone ... not needed to insist.
     
    WaitForSingleObject(pi.hProcess, 2000);
    if(retval == WAIT_OBJECT_0) fprintf(stderr,"[endProcess] closing process cleanly ...\n");
     
    DWORD dwExitCode = 0;
    GetExitCodeProcess(pi.hProcess, &dwExitCode);
    if(dwExitCode == STILL_ACTIVE)   TerminateProcess(pi.hProcess, 0);
    }
    }
    Il y a alors 2 cas :
    - l'utilisateur (appelons le bob) ne touche a rien et l'application va jusqu'au bout : pas de pb
    - bob ferme l'app graphique avant la fin : et la pb la fonction Createprocess() met un certain temps a s'executée donc si bob ferme l'app avant la fin du CreateProcess mon process fils ne se detruit pas et continue jusqu'a sa fin "normale".

    Comment gérer ca :[/code]

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 682
    Points
    10 682
    Billets dans le blog
    3
    Par défaut
    Ce n'est pas CreateProcess qui est blocant, mais WaitForSingleObject qui attend que le processus créé soit terminé.
    2 solutions:
    - empêcher de fermer ton appli père tant que le fils n'a pas fini de tourner
    - arrêter le fils avant de terminer le père
    Dans les 2 cas il faut déplacer ailleurs ton WaitForSingleObject pour ne plus être bloqué.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    fprintf(stderr,"CreateProcess");
    CreateProcess( ...);
    fprintf(stderr,"Wait until child process exits.");
    WaitForSingleObject( pi.hProcess, INFINITE );
    Il y a alors 2 cas d'arret par l'utilisateur

    cas 1 :
    stderr : CreateProcess
    Wait until child process exits.
    Pas de probleme puisque atexit() gere la fin de fils.exe avant la fin de pere.exe.
    arrêter le fils avant de terminer le père
    cas 2 :
    stderr : CreateProcess
    Probleme car on est pas encore dans WaitForSingleObject() on est dans le CreateProcess (fils.exe est en train d'etre créé) et atexit() ne se lance pas ????

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Bon j'ai réglé le problème de manière un peu détournée. J'ai rajouté de la recursivité dans EndProcess

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(monProcess.hProcess==NULL){
     Sleep(500);
     endProcess();
    }
    comme ca il attend jusqu'a ce que le process soit bien reconnu avant de le detruire

    Et ca n'a rien a voir avec WaitForSingleObject

  5. #5
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 682
    Points
    10 682
    Billets dans le blog
    3
    Par défaut
    Tu dois avoir raison...
    remplaces INFINITE par 500 dans le WaitForSingleObject, juste pour voir...

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    si je remplace INFINITE par 500 le processus fils s'arrete au bout de 500 ms apres sa creation ce qui n'est pas le but

    le but est de faire tourner le processus fils jusqu'a sa fin normale ou jusqu'a l'arret de l'utilisateur avant la fin normale

  7. #7
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 682
    Points
    10 682
    Billets dans le blog
    3
    Par défaut
    Donc WaitForSingleObject n'est pas complètement étranger au problème alors...
    Autrement dit, un simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WaitForSingleObject( pi.hProcess, INFINITE );
    dans ton EndProcess fait l'affaire.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Desolé mais soit il y a un truc que j'ai pas compris (ce qui est bien possible) soit je me suis mal exprimé sur ce que je voulais faire

    Je m'explique :
    Si je fais comme tu dis
    un simple:
    WaitForSingleObject( pi.hProcess, INFINITE );
    dans ton EndProcess fait l'affaire.
    la fonction endProcess est appelée soit à la fin de fct() soit si l'utilisateur clique sur la croix avant la fin de fct().
    La fonction endProcess se deroule et arrive jusqu'a WaitForSingleObject( pi.hProcess, INFINITE ). Dans ce cas le processus pere attend la fin du fils et se termine.

    Seulement ce n'est pas ce que je veux puisque je veux que quand l'utilisateur clique sur la croix cela entraine IMMEDIATEMENT la fin du pere qui elle meme entraine IMMEDIATEMENT la fin du fils.

Discussions similaires

  1. [Tuning] Temps execution
    Par Ne0zenith dans le forum Oracle
    Réponses: 26
    Dernier message: 07/08/2006, 14h30
  2. [ methode ] temps execution
    Par hocinema dans le forum API standards et tierces
    Réponses: 13
    Dernier message: 08/09/2005, 11h53
  3. [MFC] pb temps execution
    Par ricky78 dans le forum MFC
    Réponses: 4
    Dernier message: 21/01/2005, 11h50
  4. [EXECUTION] CreateProcess / ShellExecute
    Par jmdeffet dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 14/10/2004, 10h33
  5. Temps execution mysql
    Par azman0101 dans le forum Requêtes
    Réponses: 3
    Dernier message: 16/07/2004, 09h42

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