QObject::startTimer: Timers can only be used with threads started with QThread
我正在尝试在工作线程的事件循环中启动 Timer,但出现此错误:
这有什么问题吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #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); } |
在任何地方初始化你的计时器,但在线程启动时立即启动它(将它附加到 QThread::started 信号):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | class A : public QObject { Q_OBJECT public: A(); private slots: void started(); void timeout(); private: QThread m_workerThread; QTimer m_myTimer; }; A::A() { moveToThread(&m_workerThread); connect(&m_workerThread, SIGNAL(started()), this, SLOT(started())); connect(&m_myTimer, SIGNAL(timeout()), this, SLOT(timeout())); m_myTimer.setInterval(1000); m_myTimer.moveToThread(&m_workerThread); m_workerThread.start(); } void A::started() { timer.start(); } void A::timeout() { // timer handler } |
我想我想通了,我尝试从 GUI 线程启动计时器,在我将它移到工作线程之后,它似乎可以工作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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); } |
希望这会有所帮助:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | class ReadYoloResult : public QObject { Q_OBJECT public: ReadYoloResult(QObject *parent = 0); void startTimer(); QThread workerThread; private: QTimer *timer; public slots: void timerSlot(); }; ReadYoloResult::ReadYoloResult(QObject * parent) { this->moveToThread(&workerThread); timer = new QTimer(); connect(timer,SIGNAL(timeout()),this,SLOT(timerSlot())); workerThread.start(); //timer->start(1000); } void ReadYoloResult::startTimer(){ timer->start(100); } void ReadYoloResult::timerSlot(){ qDebug()<<"In timer slot"; } |
这种方法对我来说似乎有点危险。通过将
推荐的做法是分别实例化线程和对象。