QT用线程启动定时器-创新互联

编写QT程序时,时常会需要使用定时器QTimer来执行一些定时任务,但当定时任务执行的时间过长,则会影响整个界面的响应,因此会想到使用另一个工作线程来执行定时器,一般情况下可以选择从QThread派生一个线程类,然后重载run并执行任务逻辑,那下面就介绍一个不用从QThread派生并使用QTimer的例子。

成都创新互联公司自2013年起,先为梁园等服务建站,梁园等地企业,进行企业商务咨询服务。为梁园企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

主窗口类头文件加入:

[cpp] view plain

  1. QThread* _voiceThread;

  2. QTimer* _voiceTimer;

构造函数加入:

[cpp] view plain

  1. // 使用一个线程,跑定时器

  2. _voiceThread = new QThread;

  3. _voiceTimer = new QTimer;

  4. _voiceTimer->setSingleShot(true);

  5. // 在moveToThread前先启动定时器,不然不在一个线程里,直接调用start会失败

  6. _voiceTimer->start(200);

  7. _voiceTimer->moveToThread(_voiceThread);

  8. // 定时器对象和this不在一个线程里面,因此这边指定了连接方式为Qt::DirectConnection,由定时器所在线程直接触发_onVoiceTimeout

  9. connect(_voiceTimer, SIGNAL(timeout()), this, SLOT(_onVoiceTimeout()), Qt::DirectConnection);

  10. // 连接定时器槽,用来停止定时器

  11. connect(this, SIGNAL(stop()), _voiceTimer, SLOT(stop()));

  12. _voiceThread->start();

析构函数加入:

[cpp] view plain

  1. emit stop();

  2. _voiceThread->quit();

  3. _voiceThread->wait();

  4. delete _voiceTimer;

  5. delete _voiceThread;

定时器槽:

[cpp] view plain

  1. void Test::_onVoiceTimeout()

  2. {

  3.     // 执行任务

  4.     // ...

  5.     _voiceTimer->start(1000);

  6. }

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享名称:QT用线程启动定时器-创新互联
网页地址:http://azwzsj.com/article/hgddc.html