使用场景
主线程需要等待工作线程返回数据才能继续执行。属于线程之间的同步操作,也可以使用信号量来实现。由于在子线程创建新的内存对象需要依附在ui线程,所以采用Qt提供的moveToThread比较方便。这时操作同步需要使用信号槽的Qt::BlockingQueuedConnection。
这里官方文档写的是接收对象不能存活在发送信号的线程,也就是说信号发送者和接受者可以是同一个obj,只要保证obj不在信号发送的线程即可。
测试代码
#ifndef QSIGNALBLOCK_H
#define QSIGNALBLOCK_H
#include <QObject>
class QSignalBlock : public QObject
{
Q_OBJECT
public:
explicit QSignalBlock(QObject *parent = nullptr);
signals:
void sig_test_1();
public slots:
void slot_test_1();
};
#endif // QSIGNALBLOCK_H
#include "qsignalblock.h"
#include <QDebug>
QSignalBlock::QSignalBlock(QObject *parent) : QObject(parent)
{
connect(this, &QSignalBlock::sig_test_1, this, &QSignalBlock::slot_test_1,
Qt::ConnectionType(Qt::BlockingQueuedConnection | Qt::UniqueConnection));
}
void QSignalBlock::slot_test_1()
{
qDebug() << "slot_test_1 called";
}
main.cpp
{
QSignalBlock* obj = new QSignalBlock;
QThread* t = new QThread;
obj->moveToThread(t);
t->start();
qDebug("signal before");
obj->sig_test_1();
qDebug("signal after");
t->quit();
t->wait();
delete t;
delete obj;
}
运行结果
signal before
slot_test_1 called
signal after