QObject::startTimer:定时器只能用于以 QThread 启动的线程

use*_*911 8 qt qthread qtimer

我正在尝试在工作线程的事件循环中启动计时器,但出现此错误: QObject::startTimer: Timers can only be used with threads started with QThread

这有什么问题?

#include <QObject>
#include <QThread>
#include <QTimer>

class A : public QObject
{
    Q_OBJECT
public:
    A();

private:
    QThread m_workerThread;
    QTimer m_myTimer;

};

A::A()
{
    this->moveToThread(&m_workerThread);
    m_myTimer.moveToThread(&m_workerThread);
    m_workerThread.start();
    m_myTimer.start(1000);
}
Run Code Online (Sandbox Code Playgroud)

use*_*911 1

我想我明白了,我尝试从 GUI 线程启动计时器,在我将其移动到工作线程后,这样它似乎可以工作:

class A : public QObject
{
    Q_OBJECT
public:
    A();

private:
    QThread m_workerThread;
    QTimer m_myTimer;

public slots:
    void sl_startTimer();
};

A::A()
{
    this->moveToThread(&m_workerThread);
    m_myTimer.moveToThread(&m_workerThread);
    m_workerThread.start();
    QMetaObject::invokeMethod(this, "sl_startTimer", Qt::QueuedConnection);
}

void A::sl_startTimer()
{
    m_myTimer.start(1000);
}
Run Code Online (Sandbox Code Playgroud)

  • @SebastianLange 计时器应该位于其大多数信号接收者所在的同一线程中。否则,当发射器线程停止时,您将停止接收者线程。 (3认同)