Erstellen Sie eine benutzerdefinierte Nachricht/Ereignis mit Qt
Ich habe eine RPC-thread, der den Aufruf zurück, um mich von diesem thread. Ich muss ja irgendwie informieren Qt, die es braucht, um einen Aufruf der Funktion aus dem Haupt-thread. In gerade Windows konnte ich dies tun, indem Sie eine benutzerdefinierte Nachricht und dann posten, die message an die message queue, z.B., ich könnte einen WM_CALLFUNCTION
- Nachricht und übergeben Sie den Funktionszeiger durch wParam
und die parameter (Klasse Zeiger) durch lParam
.
Hat jemand eine Idee, wie ich könnte dies mit Qt? Ich bin gekommen, über QCustomEvent
aber ich habe keine Ahnung, wie es zu benutzen ist oder wie Sie zu verarbeiten. Jede Hilfe wäre enorm geschätzt!
Edit:
Am Ende ging ich mit QMetaObject::invokeMethod, die einwandfrei funktioniert.
In welcher Art und Weise ... Wie würde ich das nennen, das von thread B so ein, dass Ein Thread führt die Funktion ...?
Qt signal/slot-Mechanismus ist thread-sicher und kann verwendet werden, auf mehrere threads. Look-up-tutorials auf Signale/slots, wenn Sie nicht wissen, wie.
InformationsquelleAutor Goz | 2011-05-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
--
http://doc.qt.nokia.com/qq/qq14-threading.html#signalslotconnectionsacrossthreads
Für das eine ... brauche ich für das starten von Qt-thread zu tun? Da der thread brauche ich um Rückruf von ist ein nicht-QT-thread ...
Die GUI läuft im Haupt-thread. Wenn Sie nicht den Umgang mit widgets, dann müssen Sie die Unterklasse QObject und umsetzen Ihre Signale/slots.
Für den Aufbau eines signal/slot-Verbindung über threads, benutzen Sie einfach die übliche connect-Funktion. Qt Vermutungen sich, wie um die Verbindung zu realisieren, indem Sie suchen, in welchem thread das signal bekam emittiert und in welchem thread der Empfänger lebt. Sie können auch feststellen, eine Sperrung connectionm, wo ein thread sendet ein signal asynchron auf einen anderen thread, aber wartet mit der Ausführung, bis der Schlitz (durchgeführt in dem anderen thread) gibt, die sehr praktisch bei der Synchronisation der worker-threads mit der ui-thread.
Prost! Am Ende entdeckte ich QMetaObject::invokeMethod und ging mit. Gonna akzeptiere Ihre Antwort, aber trotzdem 🙂
InformationsquelleAutor Arlen
Mithilfe von benutzerdefinierten Ereignissen in der Regel umfasst das erstellen Ihrer eigenen QEvent Unterklasse überschreiben customEvent() in der QObject-Klasse, erhalten die Veranstaltung (oft in der Hauptfenster-Klasse) und einige code, der "Beiträge" der Fall aus deinem thread an die Empfänger.
Ich mag die Umsetzung der Veranstaltung posten von code als eine Methode der receiver-Klasse. So, der Anrufer hat nur wissen über den recevier Objekt und nicht eine der "Qt" - Besonderheiten. Der Anrufer ruft diese Methode auf, die dann im wesentlichen post eine Nachricht an sich selbst. Hoffentlich ist der code unten wird es deutlicher.
Den
customData1
undcustomData2
sind da, um zu zeigen, wie Sie vielleicht einige Daten zusammen, die in Ihre Veranstaltung. Sie nicht haben, umint
s.Ich hoffe ich habe nichts vergessen. Mit dieser code in einem anderen thread gerade braucht, um einen Zeiger auf eine
MainWindow
Objekt (nennen wir esmainWindow
) und rufenwo, nur für unser Beispiel
1
und2
kann alle ganzzahligen Daten.QApplication::postEvent(this, new StatisticEvent(p, dltotal, dlnow, uptotal, upnow));
Ich bin immer der Fehler,/home/phobos/Programming/FyreDL/src/cmnroutines.cpp:1241:29: error: cannot initialize a parameter of type 'QObject *' with an rvalue of type 'GekkoFyre::StatisticEvent *' QApplication::postEvent(this, new StatisticEvent(p, dltotal, dlnow, uptotal, upnow));
und ich bin mir nicht sicher, was zu tun ist. Kann mir bitte jemand helfen? Es würde sehr geschätzt werden.InformationsquelleAutor Arnold Spence