在Qt应用程序中,我的工作线程是“主”线程,我该如何与GUI线程进行通信

时间:2014-06-13 15:09:37

标签: c++ multithreading qt

通常在Qt应用程序中,可以创建一个QApplication,然后调用它的exec方法来启动GUI线程。

我的安排略有不同......我有自己的线程(即不是QThread),它在I / O上阻塞。有时,它需要将信息发送到GUI线程。

有一种安全而简单的方法吗?

我看了一眼:http://qt-project.org/doc/qt-5/threads-technologies.html 但没有什么能让我变得容易或直截了当。

我在OS X上使用QT5.3

4 个答案:

答案 0 :(得分:1)

请注意,如果您的线程不是QThread或者它没有运行Qt事件循环,您将无法使用信号槽排队连接,因为排队的事件实际上不会被处理。在这种情况下,您可以像在非Qt应用程序中那样选择经典信号量/互斥量同步。

答案 1 :(得分:1)

您可以在QObject上设置一个插槽,并使用默认或排队连接使用QMetaObject::invokeMethod,以确保在QObject的线程上调用该方法。

您也可以直接调用QObject的信号:

class MessagePasser: public QObject{
Q_OBJECT

public:
MessagePasser(QObject* p):QObject(p){}

signals:
void message(QByteArray);

}

并且在您的帖子中,当您需要发送一些信息时,您只需在message对象上调用MessagePasser

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

答案 2 :(得分:0)

从线程安全地与GUI通信的唯一方法是通过信号和插槽,而不能从自定义线程执行此操作。 QThread可以将其信号连接到GUI主线程。

答案 3 :(得分:0)

最简单的方法是在主线程上创建一个QObject派生类,其主要职责是使用信号从主线程传递事件。只需确保在主线程上实例化它。您的主要帖子不一定是QThread

当源和接收器在不同的线程上时,Qt将自动使用queued connection,这意味着将在接收者的线程上执行该插槽。