想在子線程里面觸發的信號的槽函數在子線程執行,信號槽連接必須使用DirectConnection 方式(即使跨線程,也可以強迫DirectConnection,而不能是AutoConnection)


Qt多線程的實現

1.繼承QThread,重新run

 

2.繼承Object,調用moveToThread方法

 

兩種方法各有利弊:主要參考:http://blog.51cto.com/9291927/1879757

 

在這我主要記錄一點:不管是使用那種方式,要想在子線程里面觸發的信號的槽函數在子線程執行,信號槽連接必須使用DirectConnection 方式;

版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/q862343646/article/details/80453938
 
 

64down voteaccepted

You won't see much of a difference unless you're working with objects having different thread affinities. Let's say you have QObjects A and B and they're both attached to different threads. Ahas a signal called somethingChanged() and B has a slot called handleChange().

If you use a direct connection

connect( A, SIGNAL(somethingChanged()), B, SLOT(handleChange()), Qt::DirectConnection );

the method handleChange() will actually run in the A's thread. Basically, it's as if emitting the signal calls the slot method "directly". If B::handleChange() isn't thread-safe, this can cause some (difficult to locate) bugs. At the very least, you're missing out on the benefits of the extra thread.

If you change the connection method to Qt::QueuedConnection (or, in this case, let Qt decide which method to use), things get more interesting. Assuming B's thread is running an event loop, emitting the signal will post an event to B's event loop. The event loop queues the event, and eventually invokes the slot method whenever control returns to it (it being the event loop). This makes it pretty easy to deal with communication between/among threads in Qt (again, assuming your threads are running their own local event loops). You don't have to worry about locks, etc. because the event loop serializes the slot invocations.

Note: If you don't know how to change a QObject's thread affinity, look into QObject::moveToThread. That should get you started.

Edit

I should clarify my opening sentence. It does make a difference if you specify a queued connection - even for two objects on the same thread. The event is still posted to the thread's event loop. So, the method call is still asynchronous, meaning it can be delayed in unpredictable ways (depending on any other events the loop may need to process). However, if you don't specify a connection method, the direct method is automatically used for connections between objects on the same thread (at least it is in Qt 4.8).

 

https://stackoverflow.com/questions/15051553/qt-signals-queuedconnection-and-directconnection


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM