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 :

Tester la fin d’un exécutable appelé par la fonction ShellExecute


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut Tester la fin d’un exécutable appelé par la fonction ShellExecute
    Salut


    Je doit passer un fichier bitmap « A.bmp » à un exécutable x.exe par un appel de ce dernier, x.exe va me traiter le fichier « A.bmp » et me créer un autre fichier bitmap« B.bmp » que je doit charger dans l’Image4 de ma Form1, j’utilise pour cet appel la fonction ShellExecute; sachant que : x.exe prend un temps pour s’exécuter . Ce temps ma poser un problème pour cela je me suis dit puisque la création de B.bmp implique la fin de l’exécution de x.exe et pour ne pas laisser l’utilisateur attendre sans réponse, j’ai pensé alors à utiliser un ProgressBar qui s’incrémente tant que le fichier B.bmp n’a pas été créer. une foie créer, le fichier B.bmp pourra être chargé dans Image4 .

    Voici le code qui résume ce que j’ai raconté :
    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
    {
    //suppression du fichier B  avant d’appeler l’exécutable 
    if (FileExists("B.bmp"))
          DeleteFile("B.bmp");
    // Apel de l’exécutable
    ShellExecute(Form1->Handle,"Open","C: \\x.exe",NULL,"C:\\",SW_HIDE);
      ProgressBar1->Min = 0;
      ProgressBar1->Max=10000;
    int  i=  ProgressBar1->Min;
    //Vérifier est ce que le fichier B.bmp a été bien créer autrement dit : est ce que l’exécution  de x ca été terminé ?? while(! (FileExists("B.bmp")))
      {   ProgressBar1->Position = i;
            i++;
        }
    //  B maintenant est créer
    ProgressBar1->Position =   ProgressBar1->Max;
    Image4->Picture->Bitmap->LoadFromFile("B.bmp");
    }
    Mon problème est que je ne peux pas charger le bitmap B dans l’Image ; à l’exécution quand le ProgressBar est mis au Max un message d’erreur me dit « impassible d’ouvrir le fichier ‘D:\\B.bmp’ ;
    Que dois je faire ?
    Est-ce qu’il ya d’autres solutions pour tester que x.exe a terminé son exécution ?
    Remarque : le temps d’exécution de x.exe vari selon le fichier A.bmp

    Merci d’avance

  2. #2
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Salut, à la place de ShellExecute tu pourrais utiliser CreateProcess et pour savoir s'il est fini tu peux attendre avec WaitForSingleObject.

  3. #3
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    CreateProcess semble en effet être la solution, comme le suggère Crayon.

    Un petit exemple :

    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
     
        AnsiString exeName, options ;
        exeName  = "D:\\MonDossier\\MonFichier.exe" ;
        options    =" -e -n" ;
     
        PROCESS_INFORMATION ProcessInformation;
        STARTUPINFO StUpInfo;
     
        StUpInfo.cb = sizeof(StUpInfo);
        StUpInfo.lpReserved = NULL;
        StUpInfo.lpDesktop = NULL;
        StUpInfo.lpTitle = NULL;
        StUpInfo.dwFlags = 0;
        StUpInfo.cbReserved2 = 0;
        StUpInfo.lpReserved2 = NULL;
     
    //on execute le process et on attend la fin d'execution
        if (CreateProcess( exeName.c_str(), 
                          options.c_str(), NULL,NULL,true,
                          CREATE_NEW_CONSOLE,
                          NULL,NULL,
                          &StUpInfo,&ProcessInformation) )
        {
           //Attente de la fin de l'execution du Processus
           WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
        }
     
        //Fermeture des ressources
        CloseHandle( ProcessInformation.hProcess );
        CloseHandle( ProcessInformation.hThread );

  4. #4
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut
    Salut

    Je vous remercie, sat83 et Crayon,
    J’ai fait comme vous m’avait dit sat83, on affectant le chemin de mon exécutable wt.exe au paramètre exeName, lors de l'appel une console s'affiche contenant le message d'erreur suivant:
    Error using ==>
    Too many input arguments.
    MATLAB: TooManyImputs

    En fait, wt.exe est l’exécutable de l’ m-file wt.m.

    J’ai pensé à utiliser ShellExecute avec le paramètre SW_HIDE pour cacher la console de mon exécutable wt.exe qui me gène lors de l’appel.

    est ce que vous pouvez me commenter ce message d'erreur?
    est ce qu'on peut cacher la console par cette methode ?
    Merci d’avance.

  5. #5
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    As tu penser a supprimer la ligne
    C'était juste un exemple au cas ou l'application attendais des paramètres...
    Si elle n'en attend pas, tu peux mettre NULL a la place de options

  6. #6
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut
    Salut

    Citation Envoyé par sat83 Voir le message
    As tu penser a supprimer la ligne
    C'était juste un exemple au cas ou l'application attendais des paramètres...
    Si elle n'en attend pas, tu peux mettre NULL a la place de options

    Merci sat83 ; c’été bien marché, j’ai même affecté la valeur DETACHED_PROCESS au paramètre dwCreationFlags, aulieu de CREATE_NEW_CONSOLE pour cacher la console de mon exécutable.

    Maintenant je veux un moyen pour ne pas laisser l’user attendre sans réponse (le temps que wt.exe s’exécute) en lui montrant qu’une tache est en cour d’exécution, par exemple : j’ai utilisé un ProgressBar testant la fin de l’exécution de wt.exe, mais je trouve un problème pour le choix de la valeur maximale du ProgressBar, je ne connait pas au préalable le temps d’exécution de wt.exe, car il vari selon les paramètres de wt.exe.

    Voilà ce que j’ai fait :

    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
     
    void __fastcall TForm1::wtClick(TObject *Sender)
    {
     
        AnsiString exeName, options ;
        exeName  ="C:\\Process\\wt.exe" ;
     
     
        PROCESS_INFORMATION ProcessInformation;
        STARTUPINFO StUpInfo;
     
        StUpInfo.cb = sizeof(StUpInfo);
        StUpInfo.lpReserved = NULL;
        StUpInfo.lpDesktop = NULL;
        StUpInfo.lpTitle = NULL;
        StUpInfo.dwFlags = 0;
        StUpInfo.cbReserved2 = 0;
        StUpInfo.lpReserved2 = NULL;
     
    //on execute le process et on attend la fin d'execution
        if (CreateProcess( exeName.c_str(),
                          NULL, NULL,NULL,false,
                       DETACHED_PROCESS,
                          NULL,NULL,
                          &StUpInfo,&ProcessInformation) )
     
        {
           //Attente de la fin de l'execution du Processus
           ProgressBar1->Min = 0;
      ProgressBar1->Max=50000;
    int  i=  ProgressBar1->Min;
       while(i<ProgressBar1->Max)
       {ProgressBar1->Position = i;
            i++; }
           WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
     
        }
     //Fermeture des ressources
        CloseHandle( ProcessInformation.hProcess );
        CloseHandle( ProcessInformation.hThread );
     
        Image2->Picture->Bitmap->LoadFromFile("C:\\Process\\B.bmp");
     
        }
    je veux me servir de la fonction WaitForSingleObject pour tester la fin de mon exécutable.

    Est ce que vous pouvez m'aider là dessus??

    Merci d'avance.

  7. #7
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Malheureusement c'est le problème avec les traitements non fixe: impossible d'afficher une ProgressBar vu que tu ne sais pas combien de temps cela va durer...

    Une solution pour montrer à l'utilisateur qu'un traitement est en cours c'est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Screen->Cursor = crHourGlass ; //affiche le sablier
    WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
    Screen->Cursor = crDefault; //affiche le curseur par defaut
    Sinon afficher un "SplashScreen" indiquant qu'un traitement est en cours...

  8. #8
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut
    Salut,
    Une solution pour montrer à l'utilisateur qu'un traitement est en cours c'est:
    Code :
    Screen->Cursor = crHourGlass ; //affiche le sablier
    WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
    Screen->Cursor = crDefault; //affiche le curseur par defaut
    Merci sat83, pour votre proposition, ça marche très bien, j’ai ajouter un composant Image2 et un bouton nommé Charger à ma fiche.
    Voila ce que doit faire le bouton Charger:
    • charge une image (par explorateur) dans Image1.
    • enregistrer l’image chargée dans un fichier nommé A.bm.
    Et voilà mon bouton WT qui doit
    • Appeler mon exécutable par CreateProcess Qui va (traiter A.bmp et enregistrer le résultat dans un autre fichier nommé Destination.bmp).
    • Charger le fichier Destination.bmp dans Image2
    Alors j’avais un problème au niveau du bouton WT, qui ne s’exécute pas si je lui charge une image par le bouton charger, par contre l’exécution se fait normalement si je clique directement sur WT
    Est-ce que vous pouvez m’aider là dessus ?
    Merci bien !

Discussions similaires

  1. Appel d'une méthode Java après fin d'exécution d'une procédure stockée
    Par ishika83 dans le forum Persistance des données
    Réponses: 2
    Dernier message: 18/08/2014, 15h40
  2. [XL-2010] Reprise d'une macro 1 après exécution d'une macro 2 appelée par la macro 1
    Par julio44 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/07/2014, 12h32
  3. [XL-2003] Restreindre valeurs des paramètres appelés par une fonction
    Par azerty_2 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 03/03/2011, 08h50
  4. script appellé par une fonction aveugle aux workspace
    Par Zhitoune dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 16/12/2008, 17h07
  5. Réponses: 6
    Dernier message: 09/01/2007, 01h15

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