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

Multithreading Discussion :

multithreading et qInstallMsgHandler


Sujet :

Multithreading

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Par défaut multithreading et qInstallMsgHandler
    Salut,

    J'utilise qInstallMsgHandler pour rediriger mes QDebug() vers un QTextEdit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void GUI:: messageOutput(QtMsgType type, const char *msg)
    {
    	errorTextEdit->append(msg);
    	errorTextEdit->show();
    }
    Le problème est que lorsque je fais un QDebug() dans un autre thread que le thread principale, mon programme plante puisque les manipulations du IHM ne doit ce faire quand dans le thread principale.
    J'ai pensé à envoyer un signal à l'intérieur de messageOutput mais ceci n'est pas possible puisque cette fonction doit être statique et donc ne peut pas envoyer des signals.

    Est ce que quelqu'un aurai une idée ?

    Merci

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Salut.
    Les signaux sont thread safe. En faisant un singleton avec un QObject, ça devrais marcher

    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
     
    class myMsgHandler: public QObject
    {
        Q_OBJECT
         myMsgHandler() {}
    public :
        //accès au singleton pour la connection
         static myMsgHandler & instance() 
         {
              static myMsgHandler obj;
              return obj;
          }
     
         static void MsgHandler(QtMsgType type, const char *msg)
          {
              emit instance().newMsg(type, msg);
          }
     
     
    signals :
       void newMsg(QtMsgType type, const QString &msg);
     
    }

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Par défaut
    Merci Yan !
    Ceci me semble une excellente solution. Pour une raison ou une autre ca fait un crash quand le message viens d'un autre thread que le principale.

    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
     
    NHEAGUI::NHEAGUI(QWidget *parent) : QMainWindow(parent)
    {
    	this->setupUi(this);
     
    	NHEAGUI::errorTextEdit = new QTextEdit();
    	qInstallMsgHandler(gqMsgHandler::MsgHandler);
     
    	QObject::connect(&gqMsgHandler::instance(), SIGNAL(newMsg(QtMsgType, const QString&)), 
    		this, SLOT(messageOutput(QtMsgType, const QString&)));
     
    	qDebug() << "blabla"; // ceci fonctionne car thread principale
    }
     
     
    //-----------------------------------------------------------------
    // L'object NHEAGUI à été crée dans le thread principale et 
    // donc cette SLOT sera exécuté dans ce dernier
    void NHEAGUI:: messageOutput(QtMsgType type, const QString& msg)
    {
    	errorTextEdit->append(msg);
    	errorTextEdit->show();
    }
     
    //----------------------------------------------------------------
    void gqApplicationCore::runGA()
    { 
    	qDebug() << "blabla"; // appel dans le second thread. la
    // fonction static void MsgHandler(QtMsgType type, const char *msg) que 
    // Yan m'a suggéré est appellé sans arrêt cette fois et ensuite j'ai un crash !
     
    }
    Je ne sais pas qu'est qui ce passe. En écrivant ce message, je viens de recevoir le livre "thread time", je devrais le lire peut être

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Nehmé Voir le message
    Merci Yan !
    Ceci me semble une excellente solution. Pour une raison ou une autre ca fait un crash quand le message viens d'un autre thread que le principale.
    ca m'intrigue. Si c'est lié au signal et les thread ça m'intéresse. La doc dit bien.
    because signal emission is thread-safe.

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    j'ai trouvé
    Pour le passage entre thread, il faut enregistrer QtMsgType vers les metat-type. Et ça marche au poile.

    Ca planté car l'oublie qRegisterMetaType<QtMsgType>("QtMsgType"); faisait écrire un nouveau message qui va écrire un nouveau message qui va .... jusqu'à planter lamentablement la stack. Vive le debuggeur windows pour trouver cela
    En plus ces nouveaux messages expliqué justement la solution
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    #include <QtGui>
     
     
    class myMsgHandler: public QObject
    {
        Q_OBJECT
         myMsgHandler() 
        {
           // important
            qRegisterMetaType<QtMsgType>("QtMsgType");
        }
    public :
        //accès au singleton pour la connection
         static myMsgHandler & instance()
         {
              static myMsgHandler obj;
              return obj;
          }
     
         static void MsgHandler(QtMsgType type, const char *msg)
          {
              QString s = msg;
              emit instance().newMsg(type, s);
          }
     
     
    signals :
       void newMsg(QtMsgType type, const QString &msg);
     
    };
     
     
    class maThread : public QThread
    {
        void run()
        {
            qDebug() << "Thread " <<QThread::currentThreadId();
        }
    };
     
    class MaWidget : public QWidget
    {
        Q_OBJECT
        QTextBrowser * txt;
        maThread t;
        public:
        MaWidget()
        {
            QVBoxLayout * l = new QVBoxLayout(this);
            txt = new QTextBrowser;
            l->addWidget(txt);
            QPushButton * but = new QPushButton("lancer thread");
            l->addWidget(but);
            connect(but,SIGNAL(clicked()),this,SLOT(runThread()));
            connect(&myMsgHandler::instance(),SIGNAL(newMsg(QtMsgType , const QString &)),this,SLOT(receiveMsg(QtMsgType , const QString &)));
        }
    public slots:
      void runThread()
        {
            t.start();
        }
    void receiveMsg(QtMsgType type, const QString &msg)
        {
            txt->append(msg);
        }
    };
     
    #include "main.moc"
    int main(int argc, char *argv[])
    {
     
        QApplication a(argc, argv);
        qInstallMsgHandler(myMsgHandler::MsgHandler);
        MaWidget w;
        w.show();
        return a.exec();
    }

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Par défaut
    WOW
    Je doute que j'aurai trouvé tout seul !

    Merci encore Yan !

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

Discussions similaires

  1. [Kylix] Multithreads la galère
    Par Oyoboy dans le forum EDI
    Réponses: 16
    Dernier message: 16/07/2004, 11h03
  2. [WinAPI C++] MultiThreading et PostMessage
    Par Gruik dans le forum Windows
    Réponses: 7
    Dernier message: 29/03/2004, 15h58
  3. [WinAPI C++] MultiThreading?
    Par Gruik dans le forum Windows
    Réponses: 2
    Dernier message: 25/03/2004, 00h08
  4. [Win32]App multithread
    Par billyboy dans le forum Windows
    Réponses: 5
    Dernier message: 25/09/2003, 09h57
  5. Multithreading sous HP Ux 11
    Par pykoon dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 18/10/2002, 23h36

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