编写QT程序时,时常会需要使用定时器QTimer来执行一些定时任务,但当定时任务执行的时间过长,则会影响整个界面的响应,因此会想到使用另一个工作线程来执行定时器,一般情况下可以选择从QThread派生一个线程类,然后重载run并执行任务逻辑,那下面就介绍一个不用从QThread派生并使用QTimer的例子。
主窗口类头文件加入:
QThread* _voiceThread; QTimer* _voiceTimer;
// 使用一个线程,跑定时器 _voiceThread = new QThread; _voiceTimer = new QTimer; _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();
emit stop(); _voiceThread->quit(); _voiceThread->wait(); delete _voiceTimer; delete _voiceThread;
void Test::_onVoiceTimeout() { // 执行任务 // ... _voiceTimer->start(1000); }