Qt中提供了QTimer计时器,可以单次或者多次触发,当计时结束的时候利用connect()函数可以触发自己想要的函数,具体实现如下:

创建定时器,并且和计时结束之后发射的槽函数信号连接起来:

    QTimer *timer = new QTimer;connect(timer,SIGNAL(timeout()),this,SLOT(func1()));//当计时器结束之后timeout函数触发自己的func1函数

运行和停止:

    timer->start(10000);//开始计时器,设置时间超时值为10秒//停止计时器if(timer->isActive())timer->stop();

所以想运行一个QTimer是很容易的。

但是我在写一个QTimer的时候遇到了一些问题。我希望测试一下QTimer,在一个界面上面点击开始计时按钮,便每隔0.5秒输出 “正在运行” 。 同时就在这个界面中,启动一个定时器,10秒之后输出“延时器输出!”

具体的代码如下:

头文件:

#ifndef VIDEO_H
#define VIDEO_H#include <QDialog>
#include <QTimer>
#include <QtConcurrent/QtConcurrentRun>namespace Ui {
class video;
}class video : public QDialog
{Q_OBJECTpublic:explicit video(QWidget *parent = 0);~video();
private slots:void on_pushButton_clicked();void printword();
signals:void sendsignal();private:Ui::video *ui;QTimer *timer;
};#endif // VIDEO_H

.cpp文件如下:

#include "video.h"
#include "ui_video.h"#include <QDebug>
#include <QtConcurrent/QtConcurrentRun>
#include <QTimer>video::video(QWidget *parent) :QDialog(parent),ui(new Ui::video)
{ui->setupUi(this);this->setAttribute(Qt::WA_DeleteOnClose,1);timer = new QTimer;connect(timer,SIGNAL(timeout()),this,SLOT(printword()));}video::~video()
{delete ui;
}void video::on_pushButton_clicked()
{timer->start(10000);while(!stop){qDebug()<<"正在运行"<<endl;_sleep(500);}}void video::printword(){qDebug()<<"延时器输出!"<<endl;
}

乍一看没什么问题,因为就是简单的循环输出“正在运行”,然后当计时器记够10s之后再输出 “延时器输出!” 。但是在实际运行中就出现了问题,程序一直循环输出“正在运行”,并且界面出现了卡死现象,不输出“延时器输出”字样。那么问题就来了,为什么会是这样呢?

这是因为QTimer是由事件驱动的,当我们调用start(10000)函数的时候,当计时器10s结束之后就会向事件队列中插入一个超时事件,Qt解析发现了这个时间,那么就根据connect找到我自己的func1函数进行处理。但是注意,我自己的点击按钮写的是一个无限循环,并且这个无限循环在计时器结束之前就开始了,所以无论怎么样Qt都不会找到这个超时事件了,因为它一直在处理那个无限循环,这也是单一的线程的局限性。

        所以这也给我们提了一个醒。对于界面上面如果有计时器,一定要慎重,尤其看到无限循环这种,很容易就会让界面卡死,所以我们应该用多线程来解决。解决方案如下,在界面的构造函数中新加一个线程:

// 新开一个线程来开启定时器  _thread = new QThread;  timer = new QTimer;  timer->setSingleShot(true);//只是单次触发  timer->start(10000);//开启计时  timer->moveToThread(_thread);  // 定时器对象和this不在一个线程里面,这边指定了连接方式为Qt::DirectConnection,超时后直接触发  connect(_timer, SIGNAL(timeout()), this, SLOT(printword()), Qt::DirectConnection);  _thread->start(); 

我这个写的有些简介了,事实上新建线程需要重新继承QThread类,我这里面省略了,如果不太明白的话网上有很多教程,我只是把最关键的部分放上来了。但是整体思想就是因为无限循环会阻塞自己的计时器超时事件,所以我们需要另开一个线程来执行计时器。当然,如果在这个线程中没有无限循环,Qt最终会接触到时间队列中的计时器超时事件,那么就不用麻烦多开一个线程了,直接写QTimer即可,从这个角度来说和_sleep()函数还是有些像的。

Qt QTimer在线程的应用与思考相关推荐

  1. Qt多线程-QThreadPool线程池与QRunnable

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-QThreadPool线程池与QRunnable     本文地址:http:// ...

  2. QTimer计时速度不断加快问题和QT中show函数失效问题的思考和处理

    使用QT所遇问题之QTimer和show 一. QTimer计时速度不断加快问题 1. 问题的发现 2.问题解决的思路 (1)梳理整个功能实现的逻辑 (2)监控进入定时器中断的次数 (3)跟踪参数lo ...

  3. Qt: QTimer和QThread

    让QTimer 跑在其他线程. 一般写法如下. 1. 在main thread中为worker thread指定定时器. QThread* thread = new QThread(this);thr ...

  4. Qt学习(九):QT中使用线程

    知识点 大量的数据处理任务放到子线程里面 线程创建 线程回收 线程处理函数内部,不允许操作图形界面 子线程处理一个死循环任务,通过改变标志位,让其退出死循环 子线程处理结束后,发送一个delDone信 ...

  5. Qt中使用线程的几种方式及区别

    概述 Qt中有多种创建线程的方式,每一种的应用场景和使用方式都有些区别, 这里主要简单介绍Qt里面的几大创建线程的方法,以及使用注意事项. QThread 使用QThread创建线程是我们最常见的一种 ...

  6. 【Qt】创建线程程序示例

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 创建线程类子类 04. 主窗口和程序 05. 程序执行结果 06. 附录 01. 概述 多线程编程可以有效解决在不冻结一个 ...

  7. Qt工作笔记-线程池作用之一:限制系统中执行线程的数量

    一.线程池的作用: 线程池作用就是限制系统中执行线程的数量. 根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少了浪费了系统资源,多了造成系统拥挤效率不高.用线程池控制线程数量,其 ...

  8. 【Java线程】复盘线程池使用及思考

    系统开发过程中遇到了线程池的使用,这篇文章主要记录一下线程池使用过程中遇到的问题和思考. 自定义线程池 自定义线程池 对于如何自定义线程池以及参数设置,请移步溪源<"打工人" ...

  9. 关于QT多线程子线程使用信号和

    主线程最后必须调用exit()和wait()函数 源码地址 http://download.csdn.net/download/u010261063/10185891 #ifndef QSYSENDT ...

最新文章

  1. 关于GridView手动绑定的一段代码,一切尽在不言中
  2. 斯坦福CS329S:机器学习系统设计,课程、笔记上线了!
  3. centos 查看mysql 服务器配置_在CentOS上MySQL数据库服务器配置方法
  4. Windows下通过VNC远程访问Linux服务器,并实现可视化
  5. 1git命令的使用,查看git仓库状态,添加文件到git跟踪,git提交,查看git分支,查看git仓库日志信息,切换git分支,解决git分支合并后出现冲突的问题
  6. 机器人离线编程画圆误差解决方案_工业机器人离线编程-误差分析和解决方案...
  7. db2存储过程 可以使用游标循环嵌套吗_DB2存储过程使用动态游标的例子
  8. getTime()的兼容性(ios)
  9. paip.解决 Gtk-CRITICAL **: IA__gtk_widget_show: assertion `GTK_IS_WIDGET (widget)' failed
  10. CuteEditor 6.0 在线HTML编辑器的领航者
  11. [从零开始学习FPGA编程-55]:视野篇-芯片的制程
  12. filetransferdmg魅族下载_filetransfer.dmg下载
  13. CSDN为什么要办一场面向开发者的云计算大会?
  14. vs2017c语言playsound,VS2010播放.WAW音频文件
  15. 网上传的京东撸货为什么那么火?
  16. Mature程序员演讲-二十年后的自己
  17. 用python画皮卡丘画法-用python画一只可爱的皮卡丘实例
  18. 甲骨文oracle的ocp和ocm认证难不难考?
  19. 正则表达式详解(三、常用符号的使用)
  20. venue 11 pro 刷linux,普通用户关心的JingOS问题解答,由JingOS开发人员作答

热门文章

  1. python和c 的区别-python和c语言的主要区别总结
  2. 学python有前途吗-现在学Python还有前途吗?能做什么?
  3. 5岁儿童自学python编程-小孩子如何学python?
  4. p语言是python吗-为什么说Python是一门动态语言--Python的魅力
  5. 语音识别技术发展史与行业最佳实践全解析
  6. 语音识别软件、语音识别平台和语音识别技术
  7. 二维分类教案_屈老师中班数学教案《有趣的笔》
  8. automake 框架_[]GNU_Automake_中文.pdf
  9. linux磁盘fio压力测试,fio命令 – 对磁盘进行压力测试和验证
  10. 【动态规划笔记】01背包问题:leetcode415 分割等和子集