Qt 定时器处理函数导致屏幕刷屏

  在做智慧农业实训系统的时候,我开了个定时器用来判断界面节点的掉电情况。结果出现了刷屏的现象。郁闷,不解,以后可以深究为什么,从网上找了一篇博客来解决问题,尊重原版http://blog.csdn.net/jwybobo2007/article/details/8314271

编写QT程序时,时常会需要使用定时器QTimer来执行一些定时任务,但当定时任务执行的时间过长,则会影响整个界面的响应,因此会想到使用另一个工作线程来执行定时器,一般情况下可以选择从QThread派生一个线程类,然后重载run并执行任务逻辑,那下面就介绍一个不用从QThread派生并使用QTimer的例子。

主窗口类头文件加入:

  

01.QThread* _voiceThread;  
02.QTimer* _voiceTimer;

构造函数加入:

01.// 使用一个线程,跑定时器   
02._voiceThread = new QThread;  
03._voiceTimer = new QTimer;  
04._voiceTimer->setSingleShot(true);  
05.// 在moveToThread前先启动定时器,不然不在一个线程里,直接调用start会失败   
06._voiceTimer->start(200);  
07._voiceTimer->moveToThread(_voiceThread);  
08.// 定时器对象和this不在一个线程里面,因此这边指定了连接方式为Qt::DirectConnection,由定时器所在线程直接触发_onVoiceTimeout   
09.connect(_voiceTimer, SIGNAL(timeout()), this, SLOT(_onVoiceTimeout()), Qt::DirectConnection);  
10.// 连接定时器槽,用来停止定时器   
11.connect(this, SIGNAL(stop()), _voiceTimer, SLOT(stop()));  
12._voiceThread->start();  

析构函数加入:

01.emit stop();  
02._voiceThread->quit();  
03._voiceThread->wait();  
04.  
05.delete _voiceTimer;  
06.delete _voiceThread;  

 

定时器槽:

01.void Test::_onVoiceTimeout()  
02.{  
03.    // 执行任务   
04.    // ...   
05.    _voiceTimer->start(1000);  
06.}  

 

 

posted @ 2013-01-15 17:11  onlycxue  阅读(2343)  评论(0编辑  收藏  举报