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

wxWidgets Discussion :

wxExecute et wxProcess


Sujet :

wxWidgets

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Points : 77
    Points
    77
    Par défaut wxExecute et wxProcess
    Bonjour,
    Avant que je vous parle de mon probleme je vous explique ce que je veux coder :
    J'ai une application principale(un programme, non pas une interface graphique) qui doit faire appel à d'autres programmes (des executables) qui risquent de boucler. J'ai un timer qui calcule la durée d'execution de ces autres programmes si l'un d'eux dépasse un certain temps d'execution je doit l'arreter sans pour autant que mon application principale ne soit affecté par cet arret brusque.

    Pour faire cela jai choisi d'utiliser wxProcess et wxExecute car on peut les utiliser sous windows et Unix (mon application doit tourner sous les deux OS).

    J'ai étudié un peu le sample exec fourni dans la doc de wxWidget, je m'en suis donc inspiré afin d'essayer de tester ce que je veu faire et voir si c'est possible ou pas.
    Voici mon code
    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
    45
    46
    47
    48
    49
     
    #include "wx/process.h"
    #include "wx/app.h"
    #include <iostream>
     
    using namespace std;
     
    class MyProcess : public wxProcess, public wxApp {
    public:
        MyProcess(const wxString& cmd)
            : wxProcess(0), m_cmd(cmd){
     
    	}
     
        virtual void OnTerminate(int pid, int status){
     
        }
     
    protected:
        wxString m_cmd;
    };
     
     
     
    int main(int argc, char ** argv){
    	if(argc !=2){
     		cerr << "Usage : " << argv[0] << " <exec_cmd> " << endl;
      		exit(1);
      	}
     
            const char * commande = argv[1];
     
    	wxString cmd(commande, wxConvLocal);
     
    	MyProcess * process = new MyProcess(cmd);
     
    	int pid = wxExecute(cmd, wxEXEC_MAKE_GROUP_LEADER | wxEXEC_ASYNC, process);
       	cout << " process pid " << pid << endl;
     
     
    	while(wxProcess::Exists(pid)){
    		cout << " le process existe toujours " << endl;
    	}
     
            cout << " le process est  mort " << endl;
     
     
    	return 0;
    }
    Mon programme execute en gros une commande (un executable qui affiche Hello World) en mode asynchrone, donc normalement il devrait sortir de la boucle while, mais ce n'est pas le cas il boucle à l'infini au niveau du while méme si le hello world a fini (avec un ps -ux je vois bien qu'il a fini de s'executer).

    Une petite remarque : si j'enleve le public wxApp de cette linge : class MyProcess : public wxProcess, public wxApp
    Le programme ne s'execute pas car je compile en mode debug et au niveau de la doc de wxExecute il y a cette note qui explique la ligne en question :
    NB: Currently wxExecute() can only be used from the main thread, calling this function from another thread will result in an assert failure in debug build and won't work.

    J'espere de l'aide car franchement ca commence à me gonfler cette histoire du programme qui boucle et j'espere que je peux trouver une solution à ceci avec wxExecute.
    Et si dans le pire des cas : ce que je veu faire n'est pas réalisable avec la lib wxWidget m'orienter vers une lib multi-Os qui peut m'aider à faire la méme chose.
    Merci d'avance

  2. #2
    Membre à l'essai
    Profil pro
    Expert technique
    Inscrit en
    Mai 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Mai 2005
    Messages : 13
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par stranger
    NB: Currently wxExecute() can only be used from the main thread, calling this function from another thread will result in an assert failure in debug build and won't work.
    Si tu lances ton wxExecute dans ta fonction main(), l'appel se fera dans le thread principal, donc pas besoin d'hériter de wxApp. J'ai testé ceci :

    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
     
    class MyProcess : public wxProcess
    {
    public:
    	virtual void OnTerminate(int,int);
    };
     
    void MyProcess::OnTerminate(int pid, int status)
    {
    }
     
    int main(int argc, char** argv)
    {
    	if(argc!=2)
    	{
    		cout << "Usage : " << argv[0] << " <exec_cmd> " << endl;
    		return 1;
    	}
     
    	MyProcess* process = new MyProcess();
    	int pid = wxExecute(wxString::FromAscii(argv[1]), wxEXEC_MAKE_GROUP_LEADER | wxEXEC_ASYNC, process);
    	if(!pid)
    		cout << "Le processus n'a pu démarré\n";
    	else
    	{
    		while(wxProcess::Exists(pid));
    		cout << "Le processus est fini!\n";
    	}
     
    	return 0;
    }
    Et ça fonctionne parfaitement.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par Algueron
    Si tu lances ton wxExecute dans ta fonction main(), l'appel se fera dans le thread principal, donc pas besoin d'hériter de wxApp. J'ai testé ceci :
    ....
    Et ça fonctionne parfaitement.
    Je te remercie pour ta réponse, le code que tu m'a donnée compile parfaitement, mais à l'execution j'ai une erreur.
    -Si je compile en mode debug j'ai cette erreur quand j'execute le prog.
    13:58:35: Debug: ../src/unix/baseunix.cpp(73): assert "execData.flags & wxEXEC_SYNC" failed in WaitForChild(): async execution not supported yet
    ../src/unix/baseunix.cpp(73): assert "execData.flags & wxEXEC_SYNC" failed in WaitForChild(): async execution not supported yet
    Trappe pour point d'arrêt et de trace
    -Si je compile en mode release , le programme s'execute mais l'executable je passe en parametre s'execute aussi mais le pid renvoyé est 0 et non pas le vrai pid c'est pourquoi le message suivant s'affiche
    Le processus n'a pu démarré
    j'ai remarqué aussi qu'en executant mon prog (compilé toujours en mode release) l'executable que je pass en paramétre n'est pas totalement indépendant puisque dans le main les lignes aprés le wxExecute ne sont prise en compte que si le programme passé en paramétre se termine, par contre s'il loop (ne termine pas ) alors on reste bloqué au niveau du wxExecute ce qui me semble bizare vu que j'appel wxExecute avec l'option wxEXEC_ASYNC.
    aurait-tu une idée de ce qui se passe , car moi je vois pas .

Discussions similaires

  1. wxProcess et wxExecute
    Par airod dans le forum wxPython
    Réponses: 0
    Dernier message: 13/11/2009, 22h30
  2. wxExecute dans une Dll
    Par abcdefg dans le forum wxWidgets
    Réponses: 0
    Dernier message: 27/05/2009, 16h13
  3. GetInputStream Wxprocess Text::Iconv
    Par kiki91 dans le forum Modules
    Réponses: 3
    Dernier message: 13/01/2007, 20h25

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