Membres inscrits :596
Membres en ligne : 0 Invités en ligne : 5 |
Bonjour à tous.
La fonction wxExecute permet, comme son nom l'indique, de lancer l'exécution d'un programme externe. Voici deux façons de l'utiliser : - la 1ère exécute la commande et attend la fin de cette exécution pour rendre la main au programme principal (c'est l'exécution synchrone). - la 2ème exécute la commande et rend tout de suite la main au programme principal (c'est l'exécution asynchrone). Ces deux méthodes ont chacunes leurs avantages et leurs inconvénients : - l'exécution synchrone est très facile à mettre en oeuvre, mais elle bloque le programme principal, ce qui peut être gênant dans le cas d'une commande nécessitant un temps d'exécution un peut long. - l'exécution asynchrone et un peu plus délicate à mettre en oeuvre, mais elle permet par exemple d'afficher une barre de progression pour faire patienter l'utilisateur. Dans les deux cas, il peut parfois être utile de récupérer le résultat de la ligne de commande, afin d'informer l'utilisateur des résultats obtenus. C'est ce que nous allons voir maintenant.
Première méthode : l'exécution synchrone.
Le principe est simple : - On crée un wxArrayString qui va recevoir le résultat de la ligne de commande (le flux de sortie stdout). - On crée éventuellement un autre wxArrayString pour recevoir les erreurs si on veut les traiter (le flux de sortie stderr). - On lance la commande wxExecute() - On traite le contenu du ou des wxArrayString quand l'exécution est terminée. Code wxWidgets:
Deuxième méthode : l'exécution asynchrone. Là, le principe est un peu plus compliqué : - Il faut d'abord mettre en place une méthode évènementielle pour recevoir une notification quand l'exécution de la commande sera terminée. - Il faut ensuite créer un objet wxProcess qui va servir à rediriger les flux stdout et stderr. - On lance la commande wxExecute, avec en paramètres un pointeur vers la frame qui désire recevoir la notification de fin de processus, et un pointeur vers le wxProcess créé ci-dessus. - On récupère un wxInputStream permettant de lire le flux stdout au fur et à mesure de l'exécution de la commande. - On récupère éventuellement un autre wxInputstream permettant de lire le flux stderr au fur et à mesure de l'exécution de la commande. - Lorsque l'exécution de la commande est terminée, on reçoit un évènement wxEVT_END_PROCESS. Code wxWidgets:
Quelques petites précisions :
- Dans les deux cas ci-dessus, l'éventuelle "fenêtre ms-dos ou terminal" reste invisible. Pour la faire apparaitre, il faut ajouter le flag wxEXEC_NOHIDE au dernier paramètre de la commande wxExecute, ce qui donne wxEXEC_SYNC | wxEXEC_NOHIDE dans le premier cas, et wxEXEC_ASYNC | wxEXEC_NOHIDE dans le deuxième cas. - Dans le premier cas, la fenêtre appelante est désactivée pendant tout le temps de l'exécution de la commande. Il est possible de la laisser active en ajoutant le flag wxEXEC_NODISABLE de la même façon que ci-dessus. Voilà, comme vous pouvez le constater, ça n'était pas très difficile. @+, et bonne prog ! Xav'
|