如果信号线程被阻塞,为什么接收线程中不处理信号



这是在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();

这将触发处理线程中的所有排队事件。

最新更新