2010-01-15 13 views
10

Ich rufe ein emit signal1() von einem nicht Qt-Thread. Mit Nicht-Qt-Thread meine ich nicht aus der GUI-Ereignisschleife und nicht aus irgendeiner QThread run() -Methode oder irgendeiner QThread-eigenen Ereignisschleife.emittieren Qt-Signal von nicht Qt Thread oder außerhalb Qt Main Event Loop mit um 4,5

Es ist einfach ein Pthread (pthread_create()), das eine Methode eines QObject aufruft, das Signale aussendet.

ex:

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

die „Run“ Methode meiner Pthread die einen Zeiger auf eine MyObject Instanz hat (Instanz, die innerhalb des Haupt Qt GUI Thread-Kontext erstellt war nicht die p-Strang) ruft die emitBunchOfSignals() Methoden.

Vor Qt 4,5 war das böse. Behandelt Qt 4.5 das jetzt? Ruft es qApp->PostEvent() oder etwas auf, so wird das Signal innerhalb der Qt GUI Thread (und damit auch der Steckplatz) emittiert?

dank

+0

Wenn Sie connect aufrufen, können Sie den Typ explizit auf die Verbindung in der Warteschlange festlegen. –

+0

In der Zeit, in der du diese Frage aufgeschrieben hast, hättest du den Code einfach öffnen und selbst suchen können. – shoosh

+0

Es scheint nicht einfach zu sein, da es mit Qt 3.xx abgestürzt ist. Ich bin vertraut mit der connect-Option (direkte Verbindung queueedconnection etc), aber ich dachte, es funktioniert nur zwischen QTreads oder zwischen einem QThread und der Main-Event-Schleife. Warum es mit Qt 3.xx zumindest abstürzte, war nicht einfach zu verstehen, wenn man sich den Code anschaute. Bin ich verrückt ? –

Antwort

8

Was müssen Sie sicherstellen, dass Sie eine Warteschlange Verbindung zu einem von Threads verwenden, wie Qt nicht autmatically welches Objekt erfassen kann, an dem Faden („Threadaffinität“ gehört der Begriff in der verwendet wird, Dokumentation). Sie tun dies beim Verbinden:

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

, die in dem Signal führen wird, auf der Ereignisschleife des Ziels gesetzt, und der Schlitz bezeichnet wird, wenn ihr Gewinde läuft (d.h. seine Ereignisschleife).

+3

vielen Dank. Um sicherzustellen, dass ich verstehe, was du meinst: Da mein emittierendes QObject weder zu einem QThread noch dem Haupt-Qt-GUI-Thread gehört (es gehört eigentlich zu meinem Corba-Thread), kann Qt die Thread-Affinität nicht erkennen. Daher muss ich die Verbindung zu QueuedConnection erzwingen, da AutomaticConnection in diesem speziellen Fall nicht funktioniert. Wenn das emittierende QObject jedoch zu einem QThread gehört, kann Qt die Thread-Affinität erkennen und eine automatische Verbindung wird den notwendigen Post für die Ereignisschleife des Empfänger-QObject-Threads ausführen. –

Verwandte Themen