QT用线程启动定时器
编写QT程序时,时常会需要使用定时器QTimer来执行一些定时任务,但当定时任务执行的时间过长,则会影响整个界面的响应,因此会想到使用另一个工作线程来执行定时器,一般情况下可以选择从QThread派生一个线程类,然后重载run并执行任务逻辑,那下面就介绍一个不用从QThread派生并使用QTimer的例子。
主窗口类头文件加入:
[cpp]view plaincopy
QThread*_voiceThread;
QTimer*_voiceTimer;
构造函数加入:
[cpp]view plaincopy
//使用一个线程,跑定时器
_voiceThread=newQThread;
_voiceTimer=newQTimer;
_voiceTimer->setSingleShot(true);
//在moveToThread前先启动定时器,不然不在一个线程里,直接调用start会失败
_voiceTimer->start(200);
_voiceTimer->moveToThread(_voiceThread);
//定时器对象和this不在一个线程里面,因此这边指定了连接方式为Qt::DirectConnection,由定时器所在线程直接触发_onVoiceTimeout
connect(_voiceTimer,SIGNAL(timeout()),this,SLOT(_onVoiceTimeout()),Qt::DirectConnection);
//连接定时器槽,用来停止定时器
connect(this,SIGNAL(stop()),_voiceTimer,SLOT(stop()));
_voiceThread->start();
析构函数加入:
[cpp]view plaincopy
emitstop();
_voiceThread->quit();
_voiceThread->wait();
delete_voiceTimer;
delete_voiceThread;
定时器槽:
[cpp]view plaincopy
voidTest::_onVoiceTimeout()
{
//执行任务
//...
_voiceTimer->start(1000);
}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。