Qt 使用Windows API 函数精确控制循环执行的周期时间
2016-05-20 14:11
477 查看
有时我们的线程是一个while()或for()的死循环,如果希望每隔固定时间循环执行一次,即实现固定周期的循环执行,则需要以下代码
#define CYCLE_PERIOD100 /*固定周期宏定义,单位为毫秒 */
LARGE_INTEGER litmp;
LONGLONG QStart,QEnd;
double dfSecond, dfFreq, dfTim;
int tm;
QueryPerformanceFrequency(&litmp);
dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率
QueryPerformanceCounter(&litmp);
QStart = litmp.QuadPart;// 获得初始值
while(1)
{
dfTim=0;
tm=0;
QueryPerformanceCounter(&litmp);
QEnd = litmp.QuadPart;//获得终止值
dfSecond = (double)(QEnd-QStart);
dfTim = dfSecond / dfFreq*1000;// 获得对应的时间值,单位为毫秒
tm=(int)(CYCLE_PERIOD - dfTim);
if(tm>0)
msleep(tm);
else
qDebug("WARN:cyctime %d >= cycperiod %d!",dfTim,CYCLE_PERIOD);
QueryPerformanceCounter(&litmp);
QStart = litmp.QuadPart;// 获得初始值
/*………………………………*/
/* 自己需要循环执行的代码 */
/*………………………………*/
}
说明:这里每个循环先将上次的剩余时间msleep掉,保证每次循环运行的时间固定, 注意msleep操作不要放在循环的最后,避免由于循环中的continue导致sleep不执行,当然这样写也有一个小问题,就是循环第一次运行时要先延时一个周期的时间,不过这在绝大部分程序中是没有任何影响的。
#define CYCLE_PERIOD100 /*固定周期宏定义,单位为毫秒 */
LARGE_INTEGER litmp;
LONGLONG QStart,QEnd;
double dfSecond, dfFreq, dfTim;
int tm;
QueryPerformanceFrequency(&litmp);
dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率
QueryPerformanceCounter(&litmp);
QStart = litmp.QuadPart;// 获得初始值
while(1)
{
dfTim=0;
tm=0;
QueryPerformanceCounter(&litmp);
QEnd = litmp.QuadPart;//获得终止值
dfSecond = (double)(QEnd-QStart);
dfTim = dfSecond / dfFreq*1000;// 获得对应的时间值,单位为毫秒
tm=(int)(CYCLE_PERIOD - dfTim);
if(tm>0)
msleep(tm);
else
qDebug("WARN:cyctime %d >= cycperiod %d!",dfTim,CYCLE_PERIOD);
QueryPerformanceCounter(&litmp);
QStart = litmp.QuadPart;// 获得初始值
/*………………………………*/
/* 自己需要循环执行的代码 */
/*………………………………*/
}
说明:这里每个循环先将上次的剩余时间msleep掉,保证每次循环运行的时间固定, 注意msleep操作不要放在循环的最后,避免由于循环中的continue导致sleep不执行,当然这样写也有一个小问题,就是循环第一次运行时要先延时一个周期的时间,不过这在绝大部分程序中是没有任何影响的。
相关文章推荐
- Qt编译遇到/usr/bin/ld: cannot find -lGL问题的解决方案
- 项目与软件推荐之编辑器-QOwnNotes
- Qt 获取当前时间
- 如何在QT中显示中文字符
- 指针操作:【申请】、【释放】、【YUV2BGR】、【QT保存图像】
- QT4的源代码在QT5的环境下编译
- Qt程序提示: 启动程序失败,路径或者权限错误解决方案
- QT-4.7.2的移植过程
- QT历届版本下载总汇
- Qt所有类型转换
- QT经典错误:/usr/include/qt4/QtCore/qatomic_i386.h:132: error: impossible constraint in 'asm'
- 异步消息传递技术的比较:JMS、AMQP和MQTT
- Qt控件及示例
- QT基本操作信号与槽
- Qt: test! test!
- QT类中keyPressEvent函数的重写
- 编译qt-arm版本的配置文件
- 嵌入式Qt开发环境搭建及移植到开发板----Qt学习笔记
- 什么是qt,QT Creator, QT SDK, QT Designer
- Qt Creator与Qt Designer有什么不一样?