博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qt 定时器处理函数导致屏幕刷屏
阅读量:4953 次
发布时间:2019-06-12

本文共 1170 字,大约阅读时间需要 3 分钟。

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

编写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.}

 

 

转载于:https://www.cnblogs.com/onlycxue/archive/2013/01/15/2861564.html

你可能感兴趣的文章