如何能让Qt计时器停止

attimo 2009-06-11 10:35:53
if(a>0)
t = 1;
else
t = 0;

QTimer *timer2 = new QTimer(this);
timer2->connect(timer2, SIGNAL(timeout()), this, SLOT(run()));
if(t == 1)
{
timer2->start(60000);
}
if(t == 0)
{
timer2->stop();
}



run()
{
v++;
}
现在的问题是,t = 1后,计时器运行了,每分钟run()都运行,当t=0时候run()还在运行。。就是不停。。 怎么办?
谢谢大家了!!
...全文
3517 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
goodname 2009-06-11
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 goodname 的回复:]

void Form1::time_1()
{
QTimer *timer2

这里面的这个timer2定义在Form1的类定义里面,并在构造函数里面实现
QTimer *timer2 = new QTimer(this);
timer2->connect(timer2, SIGNAL(timeout()), this, SLOT(run_one_min()));

这里只需要下面的代码。
if(t_t == 1)
{
timer2->start(60000);
}
if(t_t == 0)
{
timer2->stop();
}
[/Quote]

修正
这里面的这个timer2定义在Form1的类定义里面,并在构造函数里面实现
timer2 = new QTimer(this);
timer2->connect(timer2, SIGNAL(timeout()), this, SLOT(run_one_min()));
goodname 2009-06-11
  • 打赏
  • 举报
回复

void Form1::time_1()
{
QTimer *timer2

这里面的这个timer2定义在Form1的类定义里面,并在构造函数里面实现
QTimer *timer2 = new QTimer(this);
timer2->connect(timer2, SIGNAL(timeout()), this, SLOT(run_one_min()));

这里只需要下面的代码。
if(t_t == 1)
{
timer2->start(60000);
}
if(t_t == 0)
{
timer2->stop();
}
attimo 2009-06-11
  • 打赏
  • 举报
回复
上面代码中的第一个计时器调用canread(),canread()里条件判断后会调用protocol()
attimo 2009-06-11
  • 打赏
  • 举报
回复
Form1::Form1( QWidget* parent, const char* name, bool modal, WFlags fl )
: QDialog( parent, name, modal, WDestructiveClose | WStyle_Customize | WStyle_NoBorder ) //全屏去边栏

{
.........................


QTimer *timer1 = new QTimer(this); //定时器读can
timer1->connect(timer1, SIGNAL(timeout()), this, SLOT(canread()));
timer1->start(5);

}
void Form1::protocol()
{
........................................
if ((sdbuf[5] & 0x07) == 0x00) //已经停止
{
textLabel21->setText( trUtf8( "已经停止" ) );
t_t = 0;
}
if ((sdbuf[5] & 0x07) == 0x01) //正在启动
{
textLabel21->setText( trUtf8( "正在启动" ) );
t_t++;
time_1();
}
}

void Form1::time_1()
{
QTimer *timer2 = new QTimer(this);
timer2->connect(timer2, SIGNAL(timeout()), this, SLOT(run_one_min()));
if(t_t == 1)
{
timer2->start(60000);
}
if(t_t == 0)
{
timer2->stop();
}
}

void Form1::run_one_min()
{
if(t_t > 0)
{
v_all++;//运行总时间
v_one++;//单程运行时间
v_all_min = v_all%60;
v_all_hour = v_all/60;
s_all = QString("%1:%2").arg(v_all_hour).arg(v_all_min);
lCDNumber6->display( s_all);

v_one_min = v_one%60;
v_one_hour = v_one/60;
s_one = QString("%1:%2").arg(v_one_hour).arg(v_one_min);
lCDNumber7->display( s_one);
}
}

现在的问题,调用定时器第一次,可以运行,数据++,可停不了,再调用,又开启了一个新的定时器!!

谢谢!!
attimo 2009-06-11
  • 打赏
  • 举报
回复
是这样的,主函数,是个初始化的函数其中有一个计时器,每5毫秒调用一个协议解析函数,这个是固定执行的,协议解析函数里有对t值改变并判断的地方,所以我把timer2创建在了协议解析函数里,因为我想如果创建在初始化函数,就不会被执行,哪怕t是个全局变量。不过,我试试把timer2创建在初始化函数。 估计是不行,回头再请教大家,谢谢先。。
goodname 2009-06-11
  • 打赏
  • 举报
回复
if(a>0)
t = 1;
else
t = 0;

static QTimer *timer2;
if(t==1)
{
timer2 = new QTimer(this);
timer2->connect(timer2, SIGNAL(timeout()), this, SLOT(run()));

timer2->start(60000);
}
else
{
timer2->stop();
}

看看这样可以吗
  • 打赏
  • 举报
回复
郁闷,楼主你直接贴全代码注释吧,看着郁闷、。

QTimer类提供了定时器信号和单触发定时器。

它在内部使用定时器事件来提供更通用的定时器。QTimer很容易使用:创建一个QTimer,使用start()来开始并且把它的timeout()连接到适当的槽。当这段时间过去了,它将会发射timeout()信号。

注意当QTimer的父对象被销毁时,它也会被自动销毁。

实例:

QTimer *timer = new QTimer( myObject );
connect( timer, SIGNAL(timeout()), myObject, SLOT(timerDone()) );
timer->start( 2000, TRUE ); // 2秒单触发定时器

你也可以使用静态的singleShot()函数来创建单触发定时器。

作为一个特殊情况,一旦窗口系统事件队列中的所有事件都已经被处理完,一个定时为0的QTimer就会到时间了。

这也可以用来当提供迅速的用户界面时来做比较繁重的工作。

QTimer *t = new QTimer( myObject );
connect( t, SIGNAL(timeout()), SLOT(processOneThing()) );
t->start( 0, FALSE );

myObject->processOneThing()将会被重复调用并且应该很快返回(通常在处理一个数据项之后),这样Qt可以把事件传送给窗口部件并且一旦它完成这个工作就停止这个定时器。这是在图形用户界面应用程序中实现繁重的工作的一个典型方法,现在多线程可以在越来越多的平台上使用,并且我们希望无效事件最终被线程替代。

注意QTimer的精确度依赖于底下的操作系统和硬件。绝大多数平台支持20毫秒的精确度,一些平台可以提供更高的。如果Qt不能传送定时器触发所要求的数量,它将会默默地抛弃一些。

另一个使用QTimer的方法是为你的对象调用QObject::startTimer()和在你的类中(当然必须继承QObject)重新实现QObject::timerEvent()事件处理器。缺点是timerEvent()不支持像单触发定时器或信号那样的高级水平。

一些操作系统限制可能用到的定时器的数量,Qt会尽力在限制范围内工作。




int QTimer::start ( int msec, bool sshot = FALSE )
开始一个msec毫秒定时的定时器。
如果sshot为真,这个定时器将只会被激活一次,否则它将会持续到它被停止。

任何正在运行的定时器将被停止。


也可以参考singleShot()、stop()、changeInterval()和isActive()。



不说啥了,有单触发跟多触发设置,以及stop,我想不管你什么需求都可以满足,。
myuml 2009-06-11
  • 打赏
  • 举报
回复
if(a>0)
t = 1;
else
t = 0;

QTimer *timer2 = new QTimer(this);
timer2->connect(timer2, SIGNAL(timeout()), this, SLOT(run()));
if(t == 1)
{
timer2->start(60000);
}
if(t == 0)
{
timer2->stop();
}


new QTimer(this); 总是创建一个新计时器?

如果是,这一段代码你是在不断的调用吗?如果是,那么你创建了太多的计时器了。
stock888 2009-06-11
  • 打赏
  • 举报
回复
很多方法,比如QTimer *timer2;
定义成类成员,在构造函数中
timer2 = new QTimer(this);
timer2->connect(timer2, SIGNAL(timeout()), this, SLOT(run()));
就可以!
attimo 2009-06-11
  • 打赏
  • 举报
回复
if(a>0)
t = 1;
else
t = 0;

QTimer *timer2 = new QTimer(this);
timer2->connect(timer2, SIGNAL(timeout()), this, SLOT(run()));
if(t == 1)
{
timer2->start(60000);
}
if(t == 0)
{
timer2->stop();
}
上面这段写在一个函数里,这个函数会被主函数调用,run()是另一个函数,会被调用。 那,创建timer2应该在哪?? 谢谢。。
stock888 2009-06-11
  • 打赏
  • 举报
回复
楼主的这些是在3个函数中的吧
QTimer *timer2 = new QTimer(this);
timer2->connect(timer2, SIGNAL(timeout()), this, SLOT(run()));
应该只执行一次,在初始化的函数中.是吧?
要不你把代码都贴全了,给你调试一下!!!
lylm 2009-06-11
  • 打赏
  • 举报
回复
可能要设置超时emit this->timeout();

参考这个

http://blog.chinaunix.net/u3/94039/showart_1901916.html
stock888 2009-06-11
  • 打赏
  • 举报
回复
不会吧,停了就不会再执行的,要不楼主改成
timer2->start(60000,FASLE);
试一下!你的应该也是这个意思!
goodname 2009-06-11
  • 打赏
  • 举报
回复
我觉得当t==0之后,不应该创建timer2,以及connect了。

你应该贴出你具体的代码都是在哪写的
attimo 2009-06-11
  • 打赏
  • 举报
回复
楼上goodname正解!! 专业!! 谢谢!!

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧