2010-10-14 4 views
5

Die Win32-API verfügt über eine PostMessage-Funktion, die eine Nachricht an das Ende der GUI-Nachrichtenwarteschlange sendet, um später vom GUI-Thread verarbeitet zu werden, im Gegensatz zu SendMessage, die die Nachricht synchron mit der sendet und verarbeitet Aufrufthread.Suchen nach PostMessage-Funktionalität in Qt

Gibt es eine Qt-Lösung für PostMessage Funktionalität? Ein Mitarbeiter schlug vor, dass Qt's Server/Socket-Implementierung es bereitstellen könnte; Ist das ein vernünftiger Ansatz?

Antwort

8

Überprüfen Sie QCoreApplication::postEvent().

+0

Ich akzeptiere diese Antwort, weil sie "PostMessage" genau nachahmt, was ich gefragt habe. Allerdings entschied ich, dass ich die Lösung von jkerian (QTimer :: singleShot) verwenden werde, da sie besser in Qt's Signale/Slots passt. Danke euch beiden! –

7

Betrachten Sie QTimer::singleShot. In Ihrem Fall möchten Sie es mit einem msec Wert von 0 verwenden, der die gleiche Funktionalität bieten sollte. (Dies wird regelmäßig verwendet, um verzögerte Initialisierung zu implementieren, bis die GUI-Ereignisschleife ausgeführt wird.)

6

Ähnlich wie bei der QTimer Lösung, aber mit dem Vorteil, dass Sie Argumente übergeben kann, ist der QMetaObject :: InvokeMethod Weg:

QString SomeClass::compute(const QString&, int, double); 
... 
QMetaObject::invokeMethod(obj, "compute", Qt::QueuedConnection, 
         Q_RETURN_ARG(QString, retVal), 
         Q_ARG(QString, "sqrt"), 
         Q_ARG(int, 42), 
         Q_ARG(double, 9.7)); 

Die QueuedConnection es in der Ereignisschleife Warteschlangen, Direct direkt ausführen würde.

4

Alle Antworten sind bisher gut, ich möchte nur hinzufügen, dass Sie auch connect() mit Qt::QueuedConnection für den Verbindungstyp verwenden können.