![](/img/trans.png)
[英]How can I communicate back the result from a std::thread to the Gui main thread in Qt?
[英]In a Qt app, where my worker thread is the “main” thread, how can I communicate with the GUI thread
通常在Qt應用程序中,將創建一個QApplication,然后調用它的exec方法以啟動GUI線程。
我的安排稍有不同...我有自己的線程(即,不是QThread),並且它阻塞了I / O。 有時,它需要將信息發送到GUI線程。
有安全且簡便的方法嗎?
我看了一下這里: http : //qt-project.org/doc/qt-5/threads-technologies.html,但是沒有什么比簡單或直接使我難受的了 。
我在OS X上使用QT5.3
請注意,如果您的線程不是QThread或它沒有運行Qt事件循環,您將無法使用信號時隙排隊連接,因為實際上不會處理排隊事件。 在這種情況下,您可以像在非Qt應用程序中那樣選擇經典的信號量/互斥量同步。
您可以在QObject上設置一個插槽,並使用默認或排隊連接使用QMetaObject::invokeMethod
,以確保在QObject的線程上調用該方法。
您還可以直接調用QObject的信號:
class MessagePasser: public QObject{
Q_OBJECT
public:
MessagePasser(QObject* p):QObject(p){}
signals:
void message(QByteArray);
}
當您需要發送一些信息時,您可以在線程中簡單地在MessagePasser
對象上調用message
:
MessagePasser* passer;
QByteArray data;
//get data with blocking operation
passer->message(data);//call signal and it will pass it to the gui thread correctly through the connected slots
從線程安全地與GUI通信的唯一方法是通過信號和插槽,而您不能從自定義線程中進行通信。 QThread能夠將其信號連接到GUI主線程。
最簡單的方法是在主線程上創建QObject
派生類,該類負責使用信號傳遞來自主線程的事件。 只要確保您在主線程上實例化它即可。 您的主線程不必是QThread
。
當源和接收者位於不同的線程上時,Qt將自動使用排隊連接 ,這意味着該插槽將在接收者的線程上執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.