Qt QTimer在线程的应用与思考
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在线程的应用与思考相关推荐
- Qt多线程-QThreadPool线程池与QRunnable
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-QThreadPool线程池与QRunnable 本文地址:http:// ...
- QTimer计时速度不断加快问题和QT中show函数失效问题的思考和处理
使用QT所遇问题之QTimer和show 一. QTimer计时速度不断加快问题 1. 问题的发现 2.问题解决的思路 (1)梳理整个功能实现的逻辑 (2)监控进入定时器中断的次数 (3)跟踪参数lo ...
- Qt: QTimer和QThread
让QTimer 跑在其他线程. 一般写法如下. 1. 在main thread中为worker thread指定定时器. QThread* thread = new QThread(this);thr ...
- Qt学习(九):QT中使用线程
知识点 大量的数据处理任务放到子线程里面 线程创建 线程回收 线程处理函数内部,不允许操作图形界面 子线程处理一个死循环任务,通过改变标志位,让其退出死循环 子线程处理结束后,发送一个delDone信 ...
- Qt中使用线程的几种方式及区别
概述 Qt中有多种创建线程的方式,每一种的应用场景和使用方式都有些区别, 这里主要简单介绍Qt里面的几大创建线程的方法,以及使用注意事项. QThread 使用QThread创建线程是我们最常见的一种 ...
- 【Qt】创建线程程序示例
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 创建线程类子类 04. 主窗口和程序 05. 程序执行结果 06. 附录 01. 概述 多线程编程可以有效解决在不冻结一个 ...
- Qt工作笔记-线程池作用之一:限制系统中执行线程的数量
一.线程池的作用: 线程池作用就是限制系统中执行线程的数量. 根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少了浪费了系统资源,多了造成系统拥挤效率不高.用线程池控制线程数量,其 ...
- 【Java线程】复盘线程池使用及思考
系统开发过程中遇到了线程池的使用,这篇文章主要记录一下线程池使用过程中遇到的问题和思考. 自定义线程池 自定义线程池 对于如何自定义线程池以及参数设置,请移步溪源<"打工人" ...
- 关于QT多线程子线程使用信号和
主线程最后必须调用exit()和wait()函数 源码地址 http://download.csdn.net/download/u010261063/10185891 #ifndef QSYSENDT ...
最新文章
- 关于GridView手动绑定的一段代码,一切尽在不言中
- 斯坦福CS329S:机器学习系统设计,课程、笔记上线了!
- centos 查看mysql 服务器配置_在CentOS上MySQL数据库服务器配置方法
- Windows下通过VNC远程访问Linux服务器,并实现可视化
- 1git命令的使用,查看git仓库状态,添加文件到git跟踪,git提交,查看git分支,查看git仓库日志信息,切换git分支,解决git分支合并后出现冲突的问题
- 机器人离线编程画圆误差解决方案_工业机器人离线编程-误差分析和解决方案...
- db2存储过程 可以使用游标循环嵌套吗_DB2存储过程使用动态游标的例子
- getTime()的兼容性(ios)
- paip.解决 Gtk-CRITICAL **: IA__gtk_widget_show: assertion `GTK_IS_WIDGET (widget)' failed
- CuteEditor 6.0 在线HTML编辑器的领航者
- [从零开始学习FPGA编程-55]:视野篇-芯片的制程
- filetransferdmg魅族下载_filetransfer.dmg下载
- CSDN为什么要办一场面向开发者的云计算大会?
- vs2017c语言playsound,VS2010播放.WAW音频文件
- 网上传的京东撸货为什么那么火?
- Mature程序员演讲-二十年后的自己
- 用python画皮卡丘画法-用python画一只可爱的皮卡丘实例
- 甲骨文oracle的ocp和ocm认证难不难考?
- 正则表达式详解(三、常用符号的使用)
- venue 11 pro 刷linux,普通用户关心的JingOS问题解答,由JingOS开发人员作答
热门文章
- python和c 的区别-python和c语言的主要区别总结
- 学python有前途吗-现在学Python还有前途吗?能做什么?
- 5岁儿童自学python编程-小孩子如何学python?
- p语言是python吗-为什么说Python是一门动态语言--Python的魅力
- 语音识别技术发展史与行业最佳实践全解析
- 语音识别软件、语音识别平台和语音识别技术
- 二维分类教案_屈老师中班数学教案《有趣的笔》
- automake 框架_[]GNU_Automake_中文.pdf
- linux磁盘fio压力测试,fio命令 – 对磁盘进行压力测试和验证
- 【动态规划笔记】01背包问题:leetcode415 分割等和子集