较早创建但后来启动的QTimer无法正常工作

时间:2019-04-15 15:51:24

标签: qt

代码在C ++ / Qt中。 基本上,我想创建一个计时器(但未启动),然后在必要时启动它。但这没有用。 如果我立即创建并启动计时器,它将按预期工作。 该代码的想法如下所示:

mytimer.cpp:

#include "mytimer.h"
#include <QtCore>
MyTimer::MyTimer()
{
    timer = new QTimer(this); 
    connect(timer,SIGNAL(timeout()),this,SLOT(mySlot()));
    //    timer->start(1000);    
}

void MyTimer::mySlot()
{
    qDebug()<<"timer executed";
}


MyTimer::startTimer(void)
{
   timer->start(1000);
}

注意:startTimer()是从另一个线程通过信号触发的。我确实调试了代码,并且startTimer()函数确实按预期方式被调用,但计时器未启动。

并在 main.cpp 中:

#include <QApplication>
#include "mytimer.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MyTimer mtimer;
    qDebug()<<"DONE";

    return a.exec();
}

我不知道为什么以后无法启动计时器。

1 个答案:

答案 0 :(得分:0)

这是主要问题:“注意:startTimer()是从另一个带有信号的线程触发的”。但是,您在不同的主线程上实例化MyTimer,因为您尝试在其他线程上启动计时器。您应该在要触发超时的线程上创建计时器,或者将计时器移至该线程,然后将计时器连接至超时和插槽。例如,您可以这样做(不检查它是否真的可以工作):

MyTimer::startTimer(void)
{
   timer->moveToThread(QThread::currentThread());
   connect(timer, &QTimer::timeout, this, &MyTimer::mySlot);
   timer->start(1000);
}

但是,我建议采用以下方法,因为在线程之间移动对象可能会弄乱您的代码,使其更难管理,因此,我认为应该采用最简单的解决方案来解决您的问题。

MyTimer::startTimer(void)
{
   // Create your timer on the thread you want
   timer = new QTimer(this);

   // Connect signal and slot
   connect(timer, &QTimer::timeout, this, &MyTimer::mySlot);

   // Start the timer
   timer->start(1000);
}

使用哪种取决于您,但是您应该知道在Qt下不同线程之间的连接信号和插槽不起作用,并且所有连接都应在同一线程上实例化,并且触发这些连接的操作也应在引入连接的同一线程上执行。