这是在thread A
中调用的:
void MainApplication::notify()
{
emit mySignal();
QThread::currentThread()->sleep(5);
}
在此之前,连接和接收器创建发生:
// thread A
void MainApplication::init()
{
receiver->moveToThread(threadB);
connect(this,
&MainApplication::mySignal,
receiver,
&Receiver::onMySignal,
Qt::QueuedConnection);
}
期望:插槽Receiver::onMySignal()
在thread B
被调用。
现实:发出thread A
睡眠时不会调用插槽。
PS:我 100% 确定 thread B
的事件循环在发出信号时正在运行。
实际上应该是。以下简单示例工作正常。
class SenderObj : public QObject
{
Q_OBJECT
signals:
void happened();
public:
void triggerSignal() {
qDebug() << "Emitting 'happened'";
emit happened();
qDebug() << "Emitted 'happened'";
QThread::currentThread()->sleep(5);
}
};
class ReceiverObj : public QObject
{
Q_OBJECT
public slots:
void doSomething() {
qDebug() << "SLOT called in " << QThread::currentThread();
}
};
// In my MainWindow :
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
auto thread = new QThread(this);
thread->start();
m_senderObj = new SenderObj;
m_receiverObj = new ReceiverObj;
m_receiverObj->moveToThread(thread);
connect(m_senderObj, &SenderObj::happened, m_receiverObj, &ReceiverObj::doSomething);
}
void MainWindow::on_pushButton_clicked()
{
m_senderObj->triggerSignal();
}
当我单击按钮时,信号会立即发出,第二个线程立即执行插槽,我的主线程(MainWindow)冻结了 5 秒。
要处理此问题,您需要通过调用运行一次事件队列
QCoreApplication::processEvents();
这将触发处理线程中的所有排队事件。