Das größte Problem ist, dass Sie einfach nicht wissen können. Das heißt, wenn Sie aus der Sicht der Klasse schauen. Wenn Sie emittieren, wissen Sie nicht, was passieren wird:
- Wenn niemand mit dem Signal verbunden ist, passiert nichts
- Wenn jemand aus dem gleichen Thread verbunden ist, jede Art außer Qt :: QueuedConnection verwenden, Der Anruf wird blockiert
- Wenn jemand aus dem gleichen Thread mit Qt :: QueuedConnection verbunden ist, wird der Anruf nicht blockiert
- Wenn jemand aus einem anderen Thread mit Qt :: DirectConnection verbunden ist (sehr vorsichtig sein, wenn Sie tun das!) oder Qt :: BlockingQueuedConnection, blockiert der Anruf
- Wenn jemand aus einem anderen Thread verbunden ist mit Qt :: Autoconnect oder Qt :: QueuedConnection, wird der Anruf nicht-blockierend
Es wird noch schwieriger zu wissen, was passieren wird, wenn mehrere Objekte mit dem Internet verbunden sind Signal. In diesem Fall könnten einige Slots ausgeführt worden sein, während andere noch in der Warteschlange stehen. Es ist übrigens kein Thread mit einer nicht blockierenden Verbindung beteiligt. Es gibt nur ein Ereignis, das in der Ereignisschleife des Threads des empfangenden Objekts gepostet wird.
Beachten Sie auch, dass standardmäßig Verbindungen zwischen Objekten im selben Thread direkt (synchron) sind und Verbindungen zwischen Objekten in verschiedenen Threads in die Warteschlange gestellt werden. Wenn Sie darüber nachdenken, ist das ziemlich logisch. – quark
@quark Das stimmt nicht genau. Es spielt keine Rolle, ob sich die Objekte im selben Thread befinden oder nicht. Es spielt eine Rolle, ob der Thread, der das Signal ausgibt, der Thread ist, in dem sich das empfangende Objekt befindet. Die Qt-Dokumentation hat das sogar falsch verstanden.Quelle: [Signale und Slots über Threads] (http://qt-project.org/wiki/Threads_Events_QObjects#913fb94dd61f1a62fc809f8d842c3afa). Ich stimme zu, dass das Verhalten von Qt logisch ist. –