2009-11-14 10 views
18

Wenn ich eine Klasse A hatte, wo eine seiner Funktionen hat:Qt: Werden Ereignisse in Reihenfolge verarbeitet?

void A::func() 
{ 
    emit first_signal(); 
    emit second_signal(); 
} 

Unter der Annahme, dass eine Klasse B 2 Schlitze hat, einen mit first_signal, und die andere an second_signal wird gewährleistet, dass die Steckplatz, der mit first_signal verbunden ist, wird immer vor der second_signal Steckplatz verarbeitet?

Antwort

15

Wenn Sie den direkten Verbindungstyp zwischen Signalen und Steckplätzen verwenden (Qt :: DirectConnection), lautet die Antwort ja.

Von Qt-Hilfesystem:

Wenn ein Signal ausgesendet wird, die Schlitze mit ihm verbunden ist in die Regel sofort ausgeführt, wie ein normaler Funktionsaufruf. Wenn das passiert, ist der Signal- und Slots-Mechanismus völlig unabhängig von einer GUI-Event-Schleife . Die Ausführung des Codes nach der emit-Anweisung erfolgt, sobald alle Slots zurückgegeben wurden. Die Situation ist etwas anders, wenn in der Warteschlange Verbindungen verwendet werden; In diesem Fall wird der Code , der dem Schlüsselwort emit folgt, sofort fortgesetzt und die Steckplätze werden später ausgeführt.

Sie können Standard-Verbindungstyp zu einem enum Qt::ConnectionType in QObject::connect Methode ändern.

+1

Ich denke, dass es garantiert wäre, solange sie den gleichen Typ haben, auch wenn es nicht Standard ist. Die Warteschlange würde zwei Ereignisse mit jeweils derselben Priorität erstellen, und diese Ereignisse würden dann in der Reihenfolge verarbeitet. Außerdem lautet der Standardverbindungstyp Qt :: AutoConnection, der so lange aufgelöst wird, wie Sender und Empfänger sich im selben Thread befinden. –

+3

Der Anfangssatz Ihres Beitrags sollte 'Wenn Sie den DIREKT-Verbindungstyp zwischen Signalen und Steckplätzen verwenden '; da der Standardtyp 'Qt :: AutoConnection' ist, der sich unterschiedlich verhält, abhängig davon, ob der sendende Code und das empfangende Objekt in verschiedenen Threads leben oder nicht. Siehe ['Qt :: ConnectionType'-Dokumente] (http://qt-project.org/doc/qt-4.8/qt.html#ConnectionType-enum) und [Threads, Events und QObjects] (http: // qt- project.org/wiki/Threads_Events_QObjects). – Hossein

+2

Wenn Sie Qt :: QueuedConnection (oder Qt :: AutoConnection und der Steckplatz war in einem anderen Thread zum Signal) gewählt, würde der Slot natürlich asynchron aufgerufen werden, aber ich denke, die Frage steht immer noch "Ist es garantiert, dass der Steckplatz Das mit First_Signal verbundene wird immer vor dem Second_Signal Slot bearbeitet? " Jeder hat eine Antwort bekommen? –

Verwandte Themen