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

Qt Discussion :

Besoin d'aide sur l'utilisation d'un QThread


Sujet :

Qt

  1. #1
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 033
    Points
    19 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 033
    Points : 19 040
    Par défaut Besoin d'aide sur l'utilisation d'un QThread
    Bonjour.
    Je fais partie d'une équipe qui est en train de développer un logiciel qui contrôle un extensometre.
    En gros un opérateur met un bout de tissu dans la machine, depuis le logiciel il lance un essai et la machine démarre.

    Le logiciel dessine une courbe : force en fonctione de l'allongement.
    Nous voudrions que la courbe se dessine en temps réel.
    Pour l'instant la machine fais l'essai et met tout les points dans la base de donnée.
    Puis l'IHM récupère tout les points dans la base de donnée et trace la courbe.
    La classe machine et la classe IHM passes toutes les deux par la classe mysql pour faire ça, mais peu importe...

    J'ai éssayé de faire un QThread, mais pour l'instant je n'arrive à démarrer le run() que lorsque j'appuie sur un bouton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MyThread* pThread = new MyThread();
    connect(NomDuBouton, SIGNAL(clicked()), pThread, SLOT(start()));
    On est obligé d'utiliser connect pour lancer un QThread ?
    J'ai un peu de mal à comprendre le trip du QObject; mais je me rend compte qu'en écrivant ce post je commence à mieux comprendre.

    Apparemment ce qu'on met dans SLOT c'est le nom d'une méthode de la classe hérité de QThread et start() == run().

    Donc à chaque fois que je veux lancer une méthode de ma classe MyThread, je dois effectuer un signal (du style itemClicked dans une QListWidget, clicked pour un QButton, valueChanged dans une scrollbar, etc) ?
    Je vais devoir me renseigner sur les signaux de QDevelop.

    Si j'ai plusieurs méthodes les connect je les mets dans le constructeur de l'IHM ?

    Merci.
    Au revoir.

    Edit :
    Je comprend pas un truc je voulais faire une méthode qui reçoit un paramètre genre :
    Dans la classe MyThread :
    void Dessiner(Essai* pEssai);
    Et en l'appelant comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(NomDuBouton, SIGNAL(clicked()), pThread, SLOT(Dessiner(Essai*)));
    Mais ça ne marche pas, je peux pas retester avant jeudi...
    Enfin en gros j'ai vu ça comme exemple, mais là comment je met que c'est pEssai que j'envoie à Dessiner ?

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 011
    Points
    222 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 011
    Points : 222 527
    Billets dans le blog
    135
    Par défaut
    Bonjour,

    Citation Envoyé par thierrybenji Voir le message
    J'ai éssayé de faire un QThread, mais pour l'instant je n'arrive à démarrer le run() que lorsque j'appuie sur un bouton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MyThread* pThread = new MyThread();
    connect(NomDuBouton, SIGNAL(clicked()), pThread, SLOT(start()));
    On est obligé d'utiliser connect pour lancer un QThread ?
    Votre code fonctionne, sauf qu'a chaque appuie sur le bouton il va demarrer ( ou redemarrer ) le QThread. Enfin je crois.
    Pour répondre à la question, non, le QThread peut être demarré sans l'aide du connet. Vous n'avez juste qu'à appeler pThread->start() ...

    Citation Envoyé par thierrybenji Voir le message
    J'ai un peu de mal à comprendre le trip du QObject; mais je me rend compte qu'en écrivant ce post je commence à mieux comprendre.
    Le QObject, c'est tout comme une classe mère, pour tout les objets de Qt. Soit tout les objets de Qt, on les fonctions de QObjects par héritage. C'est une façon de concevoir une bibliothèque, normalement on a pas trop à s'en occuper

    Citation Envoyé par thierrybenji Voir le message
    Apparemment ce qu'on met dans SLOT c'est le nom d'une méthode de la classe hérité de QThread et start() == run().

    Donc à chaque fois que je veux lancer une méthode de ma classe MyThread, je dois effectuer un signal (du style itemClicked dans une QListWidget, clicked pour un QButton, valueChanged dans une scrollbar, etc) ?
    Ce comportement existe parce que vous avez fait un connect de ce genre. Après vous pouvez très bien lancer les méthode de MyThread indépendamment d'un signal. Juste en appelant simplement la fonction de votre classe.

    Citation Envoyé par thierrybenji Voir le message
    Si j'ai plusieurs méthodes les connect je les mets dans le constructeur de l'IHM ?
    Souvent je met mes connect() dans la classe. Mais cela est simplement parce que bien souvent, à la construction de l'objet, on veut qu'il soit réactif avec tout le reste du programme .

    Citation Envoyé par thierrybenji Voir le message
    Merci.
    Au revoir.
    De rien

    Citation Envoyé par thierrybenji Voir le message
    Edit :
    Je comprend pas un truc je voulais faire une méthode qui reçoit un paramètre genre :
    Dans la classe MyThread :
    void Dessiner(Essai* pEssai);
    Et en l'appelant comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(NomDuBouton, SIGNAL(clicked()), pThread, SLOT(Dessiner(Essai*)));
    Mais ça ne marche pas, je peux pas retester avant jeudi...
    Enfin en gros j'ai vu ça comme exemple, mais là comment je met que c'est pEssai que j'envoie à Dessiner ?
    Ah! Tiens, y en a encore .
    Le principe du connect, c'est que le signal doit avoir les mêmes paramètres que le slot. Pourquoi? Tout simplement car si Dessiner accepte Essai*... le signal ne peut pas vraiment crée un Essai* par magie ... Je suis d'accord que cela limite un peu ... mais en même temps il est très facile de contourner le problème avec les classes.

    Si vous avez vu un example qui permet de le faire, je veux aussi le voir. Mais jusqu'à présent ... je ne sais pas trop comment on peut faire, sans redéfinir nous même le signal.

    En espérant vous avoir aidé.

  3. #3
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 033
    Points
    19 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 033
    Points : 19 040
    Par défaut
    Merci beaucoup pour vos réponses !

    J'ai testé pThread->start() et ça lance run() en Thread contrairement à quand je fais pThread->run(). (quand je fais run(), ça lance la méthode mais ça bloque le logiciel tant que la méthode n'est pas fini)

    Mais par contre je n'arrive pas à envoyer d'attribut, si je fais pour que la methode run recoit quelque chose, quand je compile ça plante au moment ou je fais pThread->start(attribut);
    Reference inconnu à MyThread::start(Essai*) alors que dans le .h et le .cpp de MyThread ya bien run(Essai *pEssai).

    Donc je ne sais toujours pas comment faire pour que mon Thread recoit des attributs, je voudrais qu'il ait un pointeur pMySql et un pointeur pEssai.

    Je vais faire des recherches apparemment certains arrivent à modifier l'IHM depuis leur Thread.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 011
    Points
    222 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 011
    Points : 222 527
    Billets dans le blog
    135
    Par défaut
    Je pars du principe que vous avez une classe à vous, qui hérite de QThread.
    Dans cette classe, vous avez un constructeur. Pourquoi ne pas passer les attributs par le constructeur, ou même en utilisant des 'setters'?
    Et une fois que vous savez que votre Thread est complètement bien initialisé ( tout les attributs sont mis en place ) vous pouvez appeler start().

    De plus, il faut savoir ( et c'est marqué dans la documentation http://qt.developpez.com/doc/latest/qthread.html ) que pour lancer le thread dans un thread, il faut passer par start(). Sinon la fonction run, en elle même est une fonction normale ...

  5. #5
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 033
    Points
    19 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 033
    Points : 19 040
    Par défaut
    Je crois que j'ai trouvé quelque chose qui fonctionne :
    Le .h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class MyThread : public QThread
    {
    Q_OBJECT
     
    public:
    	MyThread(Essai *pEssai);
    	~MyThread();
    	void run();	
    private:
    	Essai* pEssai;
    };
    Le .cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MyThread::MyThread(Essai* NpEssai) : QThread()
    {
    	pEssai=NpEssai;
    }
    L'appelle dans l'IHM :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MyThread pThread(pEssai);
    pThread.start();
    Je vais changer pour avoir un pMySql en plus, mais on dirait bien que ça marche !

  6. #6
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 033
    Points
    19 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 033
    Points : 19 040
    Par défaut
    Ah non ça fonctionne absolument pas en fait !
    Si j'essai de me servir de pEssai ou pMySql ça plante.
    Et en plus ça ne se lance pas en thread, même en utilisant start().

    Edit :
    Bon j'arrive à lancer en Thread comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MyThread* pThread=new MyThread(pEssai, pMySql);
    pThread -> start();
    Mais en attendant dans le run quand je fais :
    ou :
    Ca plante !

    Notez que GetHost() n'existe pas en réalité, je l'ai créé juste pour le test.

    Edit :
    Ah non c'est bon tout fonctionne, c'est juste moi qui ait loupé mon test...
    Je testais avant d'avoir créé un pEssai alors forcement...

    En tout cas merci !

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 011
    Points
    222 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 011
    Points : 222 527
    Billets dans le blog
    135
    Par défaut
    Euh ... j'allais répondre ... et donc ... ça marche ?
    ( Si tel est le cas, pensez à cliquer sur le bouton résolu, juste en bas de la page )

  8. #8
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 033
    Points
    19 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 033
    Points : 19 040
    Par défaut
    Ah oui j'avais oublié de mettre résolu.
    Je remet le truc fini :

    .h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class MyThread : public QThread
    {
    Q_OBJECT
     
    public:
    	MyThread(Essai *pEssai, MySql* pMySql);
    	~MyThread();
    	void run();	
    private:
    	Essai* pEssai;
    	MySql* pMySql;
    };
    .cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    MyThread::MyThread(Essai* NpEssai, MySql* NpMySql) : QThread()
    {
    	pEssai=NpEssai;
    	pMySql=NpMySql;
    }
     
    void MyThread::run()
    {
    	qDebug()<<"Host :"<<pMySql->GetHost();	
    	qDebug()<<"Textile :"<<pEssai->GetTextile();
    }
    Dans le DialogImpl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MyThread* pThread=new MyThread(pEssai, pMySql);
    pThread -> start();

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/11/2012, 14h51
  2. Besoin d'aide sur utilisation avancée d'un treeview
    Par Linux44 dans le forum GTK+ avec C & C++
    Réponses: 0
    Dernier message: 09/05/2012, 13h39
  3. Besoin d'aide sur l'utilisation de Proximity
    Par ChtiGeeX dans le forum Maven
    Réponses: 2
    Dernier message: 06/02/2009, 17h24
  4. [SimpleXML] Utilisation
    Par Hightuxdotnet dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 20/08/2008, 11h52
  5. [CR] besoin d'aide sur les formules
    Par GuillaumeDSA dans le forum Formules
    Réponses: 4
    Dernier message: 10/07/2003, 13h19

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