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 :

Recuperer le pid d'un process avec wxwidget


Sujet :

wxWidgets

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 67
    Points : 34
    Points
    34
    Par défaut Recuperer le pid d'un process avec wxwidget
    Bonjour

    je suis actuellement en train de coder un petit programme , dans ce programme je lance une commande a l'aide de wxShell(macommandeamoi) je cherche a recuperer le pid de cette fameuse commandeamoi lancé par wxShell

    comment puis-je faire ?

    d'avance merci

  2. #2
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Avec wxShell ça va pas être simple. Utilise wxExecute en mode asynchrone ça reviendra au même et tu pourra récupérer le pid.

    http://www.wxwindows.org/manuals/2.6...html#wxexecute

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    J'ai essayé avec ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long pid=wxExecute(macommandeamoi);
    lorsque je cherche a recuperer le pid , il me donne en réalité le pid de mon application et non celui de macommandeamoi , donc quande je cherche a tuer ce fameux pid il tue mon application entiere au lieu de tuer la coimmande lancé par wxExecute

  4. #4
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Est ce que tu as lu ceci :

    Under Unix the flag wxEXEC_MAKE_GROUP_LEADER may be used to ensure that the new process is a group leader (this will create a new session if needed). Calling wxKill passing wxKILL_CHILDREN will kill this process as well as all of its children (except those which have started their own session).

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    bon j'ai essayer ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    pid= wxExecute(cmd,wxEXEC_MAKE_GROUP_LEADER);
     
     
     
        if ( wxProcess::Exists(pid))
                wxLogStatus(_T("Process %ld is running."), pid);
            else
                wxLogStatus(_T("No process with pid = %ld."), pid);
     
     
    }
    me renvoie toujours pas le bon pid ( j'ai vérifier avec la commande ps axl )
    par exemple le pid renvoyer par mon application est 17710 , en réalité avec ps axl le pid de ma commande est 17711

  6. #6
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Je viens de regarder l'exemple qu'il donnent avec la distrib et pour faire ce que tu fais, il effectue ceci :

    wxProcess *process = new MyProcess(this, cmd);
    m_pidLast = wxExecute(cmd, wxEXEC_ASYNC, process);
    Si tu n'as pas ce fichier, je te l'ai mis en fichier joint.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    bon avant tout merci pour le fichier que tu m'a donné

    comme dans cet exemple j'ai crée une classe MyProcess.h
    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
     
    #ifndef _MYPROCESS_H_
    #define _MYPROCESS_H_
    #include <wx/wx.h>
    #include "wx/process.h"
     
     
    class MyProcess : public wxProcess
    {
    public:
        MyProcess(GUI *parent, const wxString& cmd)
            : wxProcess(parent), m_cmd(cmd)
        {
            m_parent = parent;
        }
     
        virtual void OnTerminate(int pid, int status);
     
    protected:
        GUI *m_parent;
        wxString m_cmd;
    };
    Ma fonction evenement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void GUI::OnClickOuvrirLancer(wxCommandEvent& event)
    {
     
    wxProcess *process = new MyProcess(this, cmd);
    	long pid = wxExecute(cmd, wxEXEC_ASYNC, process);
     
        if ( wxProcess::Exists(pid))
                wxLogStatus(_T("Process %ld is running."), pid);
            else
                wxLogStatus(_T("No process with pid = %ld."), pid);
     
    	}
    }
    avec biensur dans ma classe GUI , #include "MyProcess.h" ajouté

    lorsque je compile j'ai l'erreur suivante , que je ne comprend pas du tout :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ../include/MyProcess.h:15:undefined reference 'to vtable for MyProcess'
    la ligne pausant le probleme est la suivante : : wxProcess(parent), m_cmd(cmd)

    merci

  8. #8
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Ce genre de problème survient lorsque tu ne définis pas une fonction virtuelle.

    Il faut que toutes les fonctions virtuelles (et surtout virtuelles pures) soient définies. (n'oublie pas les destructeurs virtuels non plus)

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    euh , je suis debutant en programmation et je ne sais pas du tout ce que c'est une fonction virtuelle pure et comment dois-je la declarer

  10. #10
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Tu devrais lire la FAQ, elle te renseignera !

    Une fonction virtuelle pure est une fonction qui est seulement déclarée dans une classe, en général on ne la définie pas (bien que ce soit possible).

    Elle transforme la classe qui la contient en classe abstraite, c'est à dire une classe que l'on ne peut pas instancier. Les filles de cette classe ne peuvent pas être instanciée tant que cette fonction n'a pas été définie. (le compilateur se plain en général !)

    Elles sont utilisées pour deux raisons (il y en a surement d'autres mais il n'y a que cela qui me vient).

    - Elles forcent une classe à ne pas être instanciable (en POO, c'est parfois utile car certaines classes n'ont pas lieu d'être instanciées)
    - Elles permetent de créer des interfaces (comme en Java), c'est à dire un comportement que doit avoir la classe qui en sont dérivées.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    Desolé mais je suis un peu perdu , je ne comprend pas trop ce que je dois faire pour que ce wxProcess de malheur fonctionne ....

  12. #12
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    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
    class MyProcess : public wxProcess
    {
    public:
        MyProcess(GUI *parent, const wxString& cmd)
            : wxProcess(parent), m_cmd(cmd)
        {
            m_parent = parent;
        }
    
        virtual void OnTerminate(int pid, int status);
    
    protected:
        GUI *m_parent;
        wxString m_cmd;
    };
    As tu définis la fonction qui est en gras ?

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    ba en fait je n'ais meme pas de MyProcess.cpp j'ai juste declaré le header de la classe , pensant que le .cpp ne servait a rien dans ce cas .
    Je vais essayé de declarer le .cpp c'est peut etre pour ca que ca bug

    merci

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    bon je crois que je suis sur la bonne voie mais j'ai encore un probleme qui est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    wxString cmd= wxT("vlc");
     wxProcess *process = new MyProcess(this, cmd);
    m_pidLast = wxExecute(cmd, wxEXEC_ASYNC, process);
    je test avec vlc et je recupere bien le pid de vlc donc ca c'est cool j'essaye ensuite avec ma vrai commande qui est la suivant : gnome-terminal -x nzbget -m curses -n .......
    la plus rien ne fonctionne le pid n'est plus bon il ne correspond en aucun cas a celui de gnome-terminal lancer precedement .
    Pourquoi utiliser gnome-terminal me demanderez -vous c'est parceque la commande que je lance se lance en graphique en console en utilisant ncurses.

    donc ma question est la suivant comment lancer ma commande en console ( wxShell ?) ou je pourrais recuperer le pid de ma commande ou , comment lancer gnome-terminal qui lui lance nzbget et comment recuperer par la suite le pid de gnome-terminal ?

  15. #15
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    je test avec vlc et je recupere bien le pid de vlc donc ca c'est cool j'essaye ensuite avec ma vrai commande qui est la suivant : gnome-terminal -x nzbget -m curses -n .......
    la plus rien ne fonctionne le pid n'est plus bon il ne correspond en aucun cas a celui de gnome-terminal lancer precedement .
    Quel est le pid que tu reçois ?

    Pourquoi utiliser gnome-terminal me demanderez -vous c'est parceque la commande que je lance se lance en graphique en console en utilisant ncurses.
    Personne ne t'a demandé de justification !

    comment lancer gnome-terminal qui lui lance nzbget et comment recuperer par la suite le pid de gnome-terminal ?
    C'est le pid de gnome-terminal ou de ton application qui t'interresses ?

    Le problème avec wxShell est qu'il est impossible (en tout cas pas à ma connaissance et de façon simple) de récupérer le pid.

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    Quel est le pid que tu reçois ?
    je recois un pid qui n'a rien a voir avec le pid reel comme au debut , genre je recois le pid 12345 , ba en realité quand je fais un ps axl le pid annoncé pour ma commande est 12346 et quand j'essaye de tué le 12345 , je recois un message comme quoi le pid n'existe pas

    C'est le pid de gnome-terminal ou de ton application qui t'interresses ?
    les 2 enfait car si je tue gnome-terminal ca ne tura pas mon application si je tue mon application ca ne tuera pas gnome-terminal

  17. #17
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    C'est peut être une histoire de session et/ou de groupe essaie avec ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wxExecute(cmd,wxEXEC_MAKE_GROUP_LEADER| wxEXEC_ASYNC, process);
    les 2 enfait car si je tue gnome-terminal ca ne tura pas mon application si je tue mon application ca ne tuera pas gnome-terminal
    En théorie tuer gnome-terminal devrait tuer ton application car ton application est sencé être un fils de la session gnome-terminal. Sauf si bien sur, tu en as fait autrement.

Discussions similaires

  1. [C] pid d'un process lancé avec system(..);
    Par waldoun dans le forum Linux
    Réponses: 5
    Dernier message: 07/05/2007, 18h06
  2. Connaitre PID d'un process lancé avec exec()
    Par hugo123 dans le forum Langage
    Réponses: 4
    Dernier message: 02/06/2006, 14h28
  3. Coment faire du post-processing avec Dx9 ?
    Par rolkA dans le forum DirectX
    Réponses: 23
    Dernier message: 24/11/2003, 21h15
  4. Réponses: 4
    Dernier message: 01/07/2003, 15h47
  5. [VB6] [Réseau] Récupérer la taille d'un fichier avec inet
    Par pcpunch dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 20/02/2003, 21h38

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