编写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);

}