Qt实现非阻塞延迟方法sleep

Qt sleep 延迟
0 786
suoniao 2021-04-23
需要:0索币

    在MFC中使用延时最多的是使用类似Sleep(5)这种写法,然而在Qt中的使用就没这么简单了,我这里编写我这常用的写法

    代码如下:

    头文件

#ifndef SLEEP_H#define SLEEP_H

#include "qcommonhelp_global.h"
//非阻塞式的延时msvoid QCOMMONHELP_EXPORT SleepMsec(int msec);void QCOMMONHELP_EXPORT SleepMsec1(int msec);
//阻塞式的延时msvoid QCOMMONHELP_EXPORT SleepMsecSuspend(int msec);void QCOMMONHELP_EXPORT SleepMsecSuspend1(int msec);
//获取当前时间戳 单位为msqint64 QCOMMONHELP_EXPORT GetCurTime();#endif

源文件

#include "QSleep.h"#include <QTime>#include <QTimer>#include <QElapsedTimer>#include <QApplication>

//非阻塞式的延时void QCOMMONHELP_EXPORT SleepMsec(int msec){  QTime curTimer = QTime::currentTime().addMSecs(msec);  while (QTime::currentTime() < curTimer)    QCoreApplication::processEvents(QEventLoop::AllEvents, 100);}
void QCOMMONHELP_EXPORT SleepMsec1(int msec){ QEventLoop loop;//定义一个新的事件循环 QTimer::singleShot(msec, &loop, SLOT(quit()));//创建单次定时器,槽函数为事件循环的退出函数 loop.exec();//事件循环开始执行,程序会卡在这里,直到定时时间到,本循环被退出}
//阻塞式的延时void QCOMMONHELP_EXPORT SleepMsecSuspend(int msec){ QTime curTimer = QTime::currentTime(); QTime nowTimer; do { nowTimer = QTime::currentTime(); } while (curTimer.msecsTo(nowTimer) <= msec);}
void QCOMMONHELP_EXPORT SleepMsecSuspend1(int msec){ QElapsedTimer t; t.start(); while (t.elapsed() < msec);}
//获取当前时间戳qint64 QCOMMONHELP_EXPORT GetCurTime(){ //获取当前时间 QDateTime dateTime = QDateTime::currentDateTime(); // 字符串格式化 QString timestamp = dateTime.toString("yyyy-MM-dd hh:mm:ss.zzz"); // 获取毫秒值 int ms = dateTime.time().msec(); // 转换成时间戳 ms qint64 epochTime = dateTime.toMSecsSinceEpoch(); return epochTime;}

我这里写了两种,一种是阻塞式的,一种是非阻塞式的,特别注意的是非阻塞式主要是为了当前延时时其他地方不必要卡死,阻塞式的就是在当前位置一直等待直到延时结束

    上面还有一个获取当前时间戳的函数,特别注意的是单位为ms,返回值是qint64,也就是long long类型的,也就是当当前的时间直接转化成数字返回,各位朋友可以试一试,而在MFC中使用的就是GetTickCount(),它的返回值类型则是long。所以从MFC转成Qt,很多写法都要跟着改变

原文 https://mp.weixin.qq.com/s/rhlpE_qhW2nUqbvKdVEGrg

回帖
  • 消灭零回复
相关主题
Qt利用QLabel组件来显示图片 0
TableView自定义代理QStyledItemDelegate实现ComboBox 0
Qt利用QGraphicsView类实现图片放大缩小平移显示 0
Qt实现非阻塞延迟方法sleep 0
Qt实现webdav客户端功能支持https协议的webdav客户端 0
Qt操作windows注册表的方法 bat从注册表中将键值删除 0
重写QSqlQueryModel实现QTableView显示图片 0
QLocalServer基于本地套接字socket的服务端server 0
Qt使用动态库的方法 QLibrary库的典型用法 0
QT实现视频播放器界面开发 0
QTableview实现鼠标放上面显示不同颜色 0
Qt的QTableView自定义委托详解 0
QTableView利用自定义委托实现日期显示下拉菜单文字颜色等 0
Qt利用QApplication::sendEvent和QMouseEvent模拟鼠标点击事件 0
Qt获取父进程路径和父进程ID代码 0
QStyledItemDelegate和QItemDelegate区别在于绘制和向视图提供编辑器的方式 0
Qt实现全局快捷键功能利用QxtGlobalShortcut库 0
利用QSS去掉QListWidget选中时的虚线框 0
如何自己使用 QEventLoop解决窗口一闪而过的问题 0
Qt 为什么没有提供跨平台的 sleep 函数? 0
相关主题
打印机USB驱动开发之实现打印服务器 0
Qt利用QLabel组件来显示图片 0
TableView自定义代理QStyledItemDelegate实现ComboBox 0
Qt利用QGraphicsView类实现图片放大缩小平移显示 0
Qt实现非阻塞延迟方法sleep 0
海康相机SDK的C++对应的接口 0
Qt实现webdav客户端功能支持https协议的webdav客户端 0
CHKDSK解决 移动硬盘只能看见盘符其它信息都看不见另外双击也打不开 0
gogs一直报errror:dial tcp xxx.xxx.xxx.xxx 宿主机的ip 0
索鸟快传2.1.2发布 0
索鸟快传2.1.1发布 0
Qt操作windows注册表的方法 bat从注册表中将键值删除 0
重写QSqlQueryModel实现QTableView显示图片 0
QLocalServer基于本地套接字socket的服务端server 0
Qt使用动态库的方法 QLibrary库的典型用法 0
QT实现视频播放器界面开发 0
QTableview实现鼠标放上面显示不同颜色 0
Qt的QTableView自定义委托详解 0
QTableView利用自定义委托实现日期显示下拉菜单文字颜色等 0
Qt利用QApplication::sendEvent和QMouseEvent模拟鼠标点击事件 0