通常在Qt应用程序中,可以创建一个QApplication,然后调用它的exec方法来启动GUI线程。
我的安排略有不同......我有自己的线程(即不是QThread),它在I / O上阻塞。有时,它需要将信息发送到GUI线程。
有一种安全而简单的方法吗?
我看了一眼:http://qt-project.org/doc/qt-5/threads-technologies.html 但没有什么能让我变得容易或直截了当。
我在OS X上使用QT5.3
答案 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,这意味着将在接收者的线程上执行该插槽。