2016-04-29 11 views
3

Ich verwende einige QThread in meiner Anwendung.Können Qt-Signale sicher von einem anderen QThread ausgegeben werden

Meine Objekte "leben" in verschiedenen Threads (ihre Besitzer Threads als Qt bedeutet, dass es anders ist) und Signal/Slots mit Warteschlangenverbindungen zu kommunizieren.

Nun, ich habe dieses Problem:

  • Objekt "A" lebt in QThread "A"
  • Objekt "B" lebt in QThread "B"
  • Gui lebt in der „Haupt-Thread "

dann:

  • Object "A" ruft eine Methode B::foo auf "B" Instanz, von seinem eigenen Thread "A"
  • die Ressourcen von dieser B::foo Methode geschützt sind mit einem Mutex, kein Problem hier B::foo aus dem Thread "A" ausführen
  • innerhalb des B::foo Methode Objekt "B" emittieren das Signal barSignal

Und ich habe einige Fragen über seine Konfiguration:

  • Ist es sicher, wie zu emittieren Ignorieren des Objekts "B" von einem Thread, der nicht der Eigentümer des "B" ist QThread?

  • Ist es sicher, Qt::AutoConnection zu verwenden, um dieses Signal in einem GUI-Objekt zu empfangen, das im "Qt-Hauptthread" lebt?

  • Ist es sicher, ein Qt::AutoConnection zu verwenden, um dieses Signal in einem Objekt "C" zu empfangen, das in seinem eigenen QThread "C" lebt?

Mein Test neigt dazu, zu allem "Ja" zu sagen. Durch Lesen der Qt emit Code scheint es in Ordnung zu sein. Aber es fand nichts in der Qt-Dokumentation über "Emitting-Signal von einem Thread, der nicht der Eigentümer Thread des Emitters ist".

Antwort

6

Es ist sicher, Signale von anderen Threads zu senden, , wenn Sie automatische oder in eine Warteschlange gestellte Verbindungen verwenden. Auto wird zu in der Warteschlange in Situationen abgeleitet, in denen das Signal in einem Thread ausgegeben wird, in dem die empfangenden QObject keine Affinität haben. Direkte Verbindungen sind nicht Thread sicher.

In der Dokumentation befindet sich ein Abschnitt "Signals and Slots Across Threads", der sich mit der Ausgabe von Signalen an Objekte in verschiedenen Threads befasst.

In Warteschlange gestellte Verbindung - Der Steckplatz wird aufgerufen, wenn die Steuerung zur Ereignisschleife des Empfänger-Threads zurückkehrt. Der Slot wird im Empfänger-Thread ausgeführt.

auch

Der Verbindungstyp, indem ein zusätzliches Argument festgelegt werden kann() zu verbinden. Beachten Sie, dass die Verwendung von direkten Verbindungen, wenn Sender und Empfänger in verschiedenen Threads leben, unsicher ist, wenn eine Ereignisschleife im Thread des Empfängers ausgeführt wird, aus demselben Grund, dass das Aufrufen einer Funktion für ein Objekt in einem anderen Thread unsicher ist.

QObject :: connect() selbst ist Thread-sicher.

+4

Es gibt auch [ein Qt Wiki Artikel] (http://wiki.qt.io/ThreadsEventsQObjects), die ich für mehr Hintergrund lesen empfehlen. – Murphy