Comment émettre de la croix-fil de signal dans Qt?
Qt documentation indique que les signaux et les slots peuvent être direct
, queued
et auto
.
Il a également déclaré que si l'objet qui possède la fente " vit " dans un thread différent de l'objet qui possède signal, émission de ces signaux sera comme message d'affectation de signal d'émettre sera de retour instantanément et fente méthode sera appelée dans le thread cible de la boucle d'événements.
Malheureusement, la documentation ne précise pas que les "vies" et pas d'exemples est disponible. J'ai essayé le code suivant:
main.h:
class CThread1 : public QThread
{
Q_OBJECT
public:
void run( void )
{
msleep( 200 );
std::cout << "thread 1 started" << std::endl;
MySignal();
exec();
}
signals:
void MySignal( void );
};
class CThread2 : public QThread
{
Q_OBJECT
public:
void run( void )
{
std::cout << "thread 2 started" << std::endl;
exec();
}
public slots:
void MySlot( void )
{
std::cout << "slot called" << std::endl;
}
};
main.cpp:
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
CThread1 oThread1;
CThread2 oThread2;
QObject::connect( & oThread1, SIGNAL( MySignal() ),
& oThread2, SLOT( MySlot() ) );
oThread1.start();
oThread2.start();
oThread1.wait();
oThread2.wait();
return a.exec();
}
De sortie est:
thread 2 started
thread 1 started
MySlot()
n'est jamais appelée :(. Ce que je fais mal?
Vous devez vous connecter pour publier un commentaire.
Il y a pas mal de problèmes avec votre code :
Ce code serait le plus susceptible de travailler (même si je ne l'ai pas testé) et je pense que c'est ce que vous voulez faire :
Maintenant MyObject vivra dans thread2 (grâce à moveToThread).
MySignal doivent être envoyées à partir thread1 (la pensée, je ne suis pas sûr que l'un, cela pourrait être envoyés à partir de thread principal, il n'a pas vraiment d'importance).
Aucun cas, la boucle est nécessaire dans thread1 depuis émettant un signal n'a pas besoin d'une boucle d'événements. Une boucle est nécessaire dans thread2 (lanched par exec()) pour recevoir le signal.
MySlot sera appelée dans thread2.
Ne pas sous-classe QThread pour Qt 4.4+
Tout Aiua la réponse est bonne, je tiens à souligner quelques problèmes avec QThread et Qt 4.6 ou 4.7.
Cet article, il résume: http://blog.qt.io/blog/2010/06/17/youre-doing-it-wrong/
Manque de Documentation sur l'intervalle Qt est une partie
Malheureusement, le problème vient d'un manque de mises à jour de la documentation. Avant de Qt 4.4 QThread avait pas de valeur par défaut run() de la mise en œuvre, ce qui signifiait que vous aviez à la sous-classe QThread pour l'utiliser.
Si vous êtes à l'aide de Qt 4.6 ou 4.7 puis vous avez presque certainement devrait pas sous-classe QThread.
Utilisation moveToThread
La clé pour obtenir les fentes à exécuter dans un thread de travail est d'utiliser la moveToThread méthode Aiua a souligné.
QThread
et dominanterun()
est pris en charge par Qt. C'est même la première solution proposée par Qt sur cette table. Cependant, cela ne devrait être utilisé que lorsqu'aucun événement boucle est nécessaire pour le thread. En particulier, si quelqu'un à besoin d'appelermoveToThread(this);
à l'intérieur du fil, comme indiqué dans l'article lié, il l'utilise à tort.vous devez émettre le signal de départ de votre fonction de thread comme
vous pouvez ajouter plus d'un argument dans ce signal