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