簡體   English   中英

在我的工作線程為“主”線程的Qt應用中,如何與GUI線程通信

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM