Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Qt] utilisation de la calsse QThread

manipuler des processus...

Sujet résolu
    20 mars 2008 à 16:44:03

    Bonjour à tous.

    J'essaye de comprendre comment utiliser des processus pour un de mes programmes.
    Le problème, c'est que mes testes ne marchent pas (même les plus basics...)

    J'ai une classe MaFenetre dans laquelle il y a un objet MonThread. Quand le programme se lance, la fenêtre est ouverte et le thread est lancé.
    Dès que le thread commence ou fini, je l'affiche dans un QTextBrowser.

    Le hic c'est que rien ne d'affiche...


    main.cpp
    1. #include <QApplication>
    2. #include "Fenetre.h"
    3. int main(int argc, char *argv[])
    4. {
    5.     QApplication app(argc, argv);
    6.     MaFenetre fenetre;
    7.     fenetre.show();
    8.     return app.exec();
    9. }


    MaFenetre.h
    1. #ifndef DEF_Fenetre
    2. #define DEF_Fenetre
    3. #include <QApplication>
    4. #include <QWidget>
    5. #include <QLabel>
    6. #include <QRadioButton>
    7. #include <QTextBrowser>
    8. #include <QTextEdit>
    9. #include <QLineEdit>
    10. #include <QPushButton>
    11. #include <QListView>
    12. #include <QVBoxLayout>
    13. #include <QHBoxLayout>
    14. #include <QButtonGroup>
    15. #include "Thread.h"
    16. class MaFenetre : public QWidget
    17. {
    18.     public:
    19.     MaFenetre();
    20.     private:
    21.     QLabel *a_LabelPseudo, *a_LabelMessagePerso;
    22.     QRadioButton *a_RadioButtonConnecte, *a_RadioButtonAbsent, *a_RadioButtonOccupe, *a_RadioButtonTexte, *a_RadioButtonHtml;
    23.     QButtonGroup *a_ButtonGroupStatut, *a_ButtonGroupStyleMessage;
    24.     QTextBrowser *a_TextBrowserMessage;
    25.     QTextEdit *a_TextEditMessage;
    26.     QLineEdit *a_LineEditMessagePerso;
    27.     QListView *a_ListViewContact;
    28.     QPushButton *a_ButtonGras, *a_ButtonItalique, *a_ButtonSouligne, *a_ButtonPolice, *a_ButtonCouleur, *a_ButtonEnvoyer;
    29.     QVBoxLayout *a_VLayoutFenetre, *a_VLayoutContact, *a_VLayoutMessage;
    30.     QHBoxLayout *a_HLayoutMessagePerso, *a_HLayoutEnvoiMessage, *a_HLayoutStyleMessage, *a_HLayoutContactMessage;
    31.     MonThread a_receptionTCP;
    32. };
    33. #endif


    MaFenetre.cpp
    1. #include "Fenetre.h"
    2. MaFenetre::MaFenetre() : QWidget()
    3. {
    4.     //setFixedSize(300, 150);
    5.     a_VLayoutFenetre = new QVBoxLayout(this);
    6.     a_VLayoutContact = new QVBoxLayout(this);
    7.     a_VLayoutMessage = new QVBoxLayout(this);
    8.     a_HLayoutMessagePerso = new QHBoxLayout(this);
    9.     a_HLayoutEnvoiMessage = new QHBoxLayout(this);
    10.     a_HLayoutStyleMessage = new QHBoxLayout(this);
    11.     a_HLayoutContactMessage = new QHBoxLayout(this);
    12.     a_ButtonGroupStatut = new QButtonGroup(this);
    13.     a_ButtonGroupStyleMessage = new QButtonGroup(this);
    14.     a_ButtonGras = new QPushButton("Gras", this);
    15.     a_ButtonItalique = new QPushButton("Italique", this);
    16.     a_ButtonSouligne = new QPushButton("Souligner", this);
    17.     a_ButtonPolice = new QPushButton("Police", this);
    18.     a_ButtonCouleur = new QPushButton("Couleur", this);
    19.     a_ButtonEnvoyer = new QPushButton("Envoyer", this);
    20. a_ButtonGras->setIcon(QIcon("test.png"));
    21.     a_LabelPseudo = new QLabel("", this);
    22.     a_LabelMessagePerso = new QLabel("Message Perso :", this);
    23.     a_RadioButtonConnecte = new QRadioButton("connecté", this);
    24.     a_RadioButtonAbsent = new QRadioButton("absent", this);
    25.     a_RadioButtonOccupe = new QRadioButton("occupé", this);
    26.     a_RadioButtonHtml = new QRadioButton("HTML", this);
    27.     a_RadioButtonTexte = new QRadioButton("Texte", this);
    28.     a_ButtonGroupStatut->addButton(a_RadioButtonConnecte);
    29.     a_ButtonGroupStatut->addButton(a_RadioButtonAbsent);
    30.     a_ButtonGroupStatut->addButton(a_RadioButtonOccupe);
    31.     a_ButtonGroupStyleMessage->addButton(a_RadioButtonHtml);
    32.     a_ButtonGroupStyleMessage->addButton(a_RadioButtonTexte);
    33.     a_RadioButtonConnecte->setChecked(true);
    34.     a_RadioButtonHtml->setChecked(true);
    35.     a_TextBrowserMessage = new QTextBrowser(this);
    36.     a_TextEditMessage = new QTextEdit(this);
    37.     a_LineEditMessagePerso = new QLineEdit(this);
    38.     a_ListViewContact = new QListView(this);
    39.     a_HLayoutMessagePerso->addWidget(a_LabelMessagePerso);
    40.     a_HLayoutMessagePerso->addWidget(a_LineEditMessagePerso);
    41.     a_HLayoutMessagePerso->addWidget(a_RadioButtonConnecte);
    42.     a_HLayoutMessagePerso->addWidget(a_RadioButtonAbsent);
    43.     a_HLayoutMessagePerso->addWidget(a_RadioButtonOccupe);
    44.     a_HLayoutEnvoiMessage->addWidget(a_TextEditMessage);
    45.     a_HLayoutEnvoiMessage->addWidget(a_ButtonEnvoyer);
    46.     a_HLayoutStyleMessage->addWidget(a_ButtonGras);
    47.     a_HLayoutStyleMessage->addWidget(a_ButtonItalique);
    48.     a_HLayoutStyleMessage->addWidget(a_ButtonSouligne);
    49.     a_HLayoutStyleMessage->addWidget(a_ButtonPolice);
    50.     a_HLayoutStyleMessage->addWidget(a_ButtonCouleur);
    51.     a_HLayoutStyleMessage->addWidget(a_RadioButtonTexte);
    52.     a_HLayoutStyleMessage->addWidget(a_RadioButtonHtml);
    53.     a_VLayoutContact->addWidget(a_ListViewContact);
    54.     a_VLayoutMessage->addWidget(a_LabelPseudo);
    55.     a_VLayoutMessage->addWidget(a_TextBrowserMessage);
    56.     a_VLayoutMessage->addLayout(a_HLayoutStyleMessage);
    57.     a_VLayoutMessage->addLayout(a_HLayoutEnvoiMessage);
    58.     a_HLayoutContactMessage->addLayout(a_VLayoutContact);
    59.     a_HLayoutContactMessage->addLayout(a_VLayoutMessage);
    60.     a_VLayoutFenetre->addLayout(a_HLayoutMessagePerso);
    61.     a_VLayoutFenetre->addLayout(a_HLayoutContactMessage);
    62.     QObject::connect(&a_receptionTCP, SIGNAL(started()), a_TextBrowserMessage, SLOT(setText("Processus :: started")));
    63.     QObject::connect(&a_receptionTCP, SIGNAL(finished()), a_TextBrowserMessage, SLOT(setText("Processus :: finished")));    
    64.     a_receptionTCP.start();
    65. }



    MonThread.h
    1. #ifndef DEF_Thread
    2. #define DEF_Thread
    3. #include <QApplication>
    4. #include <QThread>
    5. class MonThread : public QThread
    6. {    
    7.     protected:
    8.     void run();
    9.     private:
    10. };
    11. #endif



    MonThread.cpp
    1. #include "Thread.h"
    2. void MonThread::run()
    3. {
    4.      for(int i = 0; i < 1000000; i++);
    5. }


    Le thread est vraiment basique. C'est juste pour tester le déclenchement et l'arrêt du processus ...
    Au final, je m'en servirais pour recevoir des messages via les sockets TCP.

    Pouvez-vous m'aider à faire marcher mon thread SVP ??
    • Partager sur Facebook
    • Partager sur Twitter
      20 mars 2008 à 17:24:41

      parce que tes "connect" sont faux !!!!
      • Partager sur Facebook
      • Partager sur Twitter
        20 mars 2008 à 18:21:29

        Comment ça ils sont faux ?? Oo

        EDIT : ok, je viens de comprendre : mon signal n'envoi pas de parametre mais mon slot en reçoit un c'est ça ??

        Dans ce cas, comment j'envoie un paramètre au slot ??
        Je ne dois quand même pas recoder la classe QPushButton pour avoir un signal qui renvoi le nom qui bouton ?? :euh:
        • Partager sur Facebook
        • Partager sur Twitter
          20 mars 2008 à 20:50:14

          Si je puis me permettre... Quel est l'intérêt final ? Gérer des connections TCP ?
          Les classes de sockets de Qt le font déjà très bien, que ce soit de manière asynchrone ou non... Et elles ont déjà tout un ensemble de signaux et slots pratiques : paquets reçus, déconnection...

          Sinon, pour envoyer des paramètres via tes slots, à toi de créer un signal et un slot qui auront la même signature, c'est-à-dire, des prototypes identiques.
          • Partager sur Facebook
          • Partager sur Twitter
            20 mars 2008 à 22:03:21

            le Thread, c'est pour recevoir un message via un socket TCP
            Vu que l'attente d'un message bloque le programme, je le met dans un thread.

            Sinon, le soft, c'est un tchat en local (genre MSN)

            • Partager sur Facebook
            • Partager sur Twitter
              20 mars 2008 à 22:20:51

              Hem, tu as lu ce que j'ai écrit ?

              Citation : groscask

              Gérer des connections TCP ?
              Les classes de sockets de Qt le font déjà très bien, que ce soit de manière asynchrone...



              Comprendre : elles peuvent ne pas être bloquantes leurs sockets =)

              C'est fou le nombre de trucs auxquels ils ont déjà pensé...

              J'te dis ça parce que je m'en suis déjà servi aussi.
              Après, c'est toi qui voit : soit tu joues avec leur truc qui marchent très bien et qui sont très pratiques, soit tu t'amuses à réinventer l'biniou...
              • Partager sur Facebook
              • Partager sur Twitter
                22 mars 2008 à 14:52:06

                Citation : groscask

                Hem, tu as lu ce que j'ai écrit ?

                Citation : groscask

                Gérer des connections TCP ?
                Les classes de sockets de Qt le font déjà très bien, que ce soit de manière asynchrone...



                Comprendre : elles peuvent ne pas être bloquantes leurs sockets =)

                C'est fou le nombre de trucs auxquels ils ont déjà pensé...

                J'te dis ça parce que je m'en suis déjà servi aussi.
                Après, c'est toi qui voit : soit tu joues avec leur truc qui marchent très bien et qui sont très pratiques, soit tu t'amuses à réinventer l'biniou...



                A ok !!! mais c'est magnifique ça !! :)
                Merci pour le renseignement !
                Aurais-tu un tuto pour apprendre à s'en servir ou alors un exemple simple avec juste une connection, un envoi et une réception ?? (sinon, c'est pas grave, je décoderais la doc comme d'habitude, c'est juste pour gagner du temps :) )

                • Partager sur Facebook
                • Partager sur Twitter
                  22 mars 2008 à 19:43:32

                  Non désolé, pas d'exemple sous la main... Mais la doc est suffisamment claire et précise : simplement, pense à aller regarder les signaux du coté de QIODevice, notamment le readyRead(), ce genre là.
                  Idem avec leur QAbstractSocket.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  [Qt] utilisation de la calsse QThread

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown