代码在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();
}
我不知道为什么以后无法启动计时器。
答案 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下不同线程之间的连接信号和插槽不起作用,并且所有连接都应在同一线程上实例化,并且触发这些连接的操作也应在引入连接的同一线程上执行。