2010-01-15 8 views
10

J'appelle un emit signal1() à partir d'un thread non Qt. Par thread non Qt, je ne veux pas dire de la boucle d'événements de l'interface utilisateur graphique et non d'une méthode QThread() ou d'une boucle d'événement QThread.Emettre un signal Qt à partir d'une boucle d'événement principal Qt Thread ou Qt non Qt à 4,5

C'est simplement un pthread (pthread_create()) qui appelle une méthode d'un QObject qui émet des signaux.

ex:

MyQbject: public QObject 
{ 
... 
void emitBunchOfSignals() 
{ 
emit signal1(); 
emit signal2(); 
... 
} 
... 
} 

le "run" méthode de mon pthread qui a un pointeur vers une instance MyObject (instance qui a été créé dans le cadre principal de fil GUI Qt PAS le pthread) appelle les méthodes emitBunchOfSignals().

Avant Qt 4,5 qui était méchant. Maintenant, Qt 4.5 gère-t-il cela? Appelle-t-il qApp->PostEvent() ou quelque chose de sorte que le signal soit émis dans le Qt GUI Thread (et ainsi le slot)?

grâce

+0

Lorsque vous appelez connect, vous pouvez définir explicitement le type de connexion en file d'attente. –

+0

Pendant le temps qu'il vous a fallu pour écrire cette question, vous auriez pu ouvrir le code et chercher vous-même. – shoosh

+0

Cela ne semble pas simple, car il avait l'habitude de planter avec Qt 3.xx. Je suis familier avec l'option connect (connexion directe queuedconnection etc) mais je pensais que cela fonctionnait seulement entre QTreads ou entre un QThread et la boucle d'événement principal. Pourquoi il avait l'habitude de planter avec Qt 3.xx au moins n'était pas simple à comprendre en regardant le code. Suis-je fou ? –

Répondre

8

Ce que vous devez vous assurer que vous utilisez une connexion en file d'attente à un à partir de fils, comme Qt ne peut pas détecter autmatically quel objet qui appartient à quel fil (« affinité de fil » est le terme utilisé dans le Documentation). Pour ce faire, lors de la connexion:

connect(src, SIGNAL(signal-signature), dest, SLOT(slot-signature), Qt::QueuedConnection); 

Cela se traduira par le signal étant mis sur la boucle d'événements de la destination et la fente étant appelée quand son fil est en cours d'exécution (à savoir sa boucle d'événement).

+3

merci beaucoup. Pour être certain de comprendre ce que vous voulez dire: Puisque QObject n'émet pas à QThread ni au thread Qt principal de QI (il appartient à mon thread Corba), Qt ne peut pas détecter l'affinité du thread. Je dois donc forcer la connexion à QueuedConnection car AutomaticConnection ne fonctionnera pas dans ce cas particulier. Cependant, lorsque le QObject émetteur appartient à un QThread, Qt peut détecter l'affinité du thread et une connexion automatique effectuera le post nécessaire sur la boucle Event du thread QObject du récepteur. –