MFC中SetTimer定时不准确?试试用多媒体定时器吧_多媒体定时器 与settimer_动感小麦兜的博客-程序员秘密

技术标签: MFC  

最近做一个项目,需要用到1ms的定时器中断,但用SetTimer总是觉得不准确,后来用程序一测试,还真是不准,定时时间设为1ms,但实际大约没10ms触发一次中断,至于如何测试的后面有代码。网上很多人也说了SetTimer定时不准确的问题,后来用多媒体定时器,就比较准了。

多媒体定时器使用方法:

添加头文件

#include "mmsystem.h"  //head file
#pragma comment(lib,"winmm")  //lib file

下面是函数

void CALLBACK SendFun(UINT wTimerID, UINT msg, DWORD dwUser, DWORD dwl, DWORD dw2);
MMRESULT g_wTimerID = 0;

int   timeRes = 1 ;bool CIExample0042aDlg::CreateTimer(){ TIMECAPS tc; UINT wTimerRes; //设置多媒体定时器 if(timeGetDevCaps(&tc,sizeof(TIMECAPS))!=TIMERR_NOERROR)//向机器申请一个多媒体定时器 return false;//获得机器允许的时间间隔(一般可达到1毫秒) wTimerRes=min(max(tc.wPeriodMin,1),tc.wPeriodMax);
 //定时器开始工作 timeBeginPeriod(wTimerRes); timeRes=wTimerRes;//每过6毫秒调用回调函数timerback(),wTimerID为定时器ID.TIME_PERIODIC表周期性调用,TIME_ONESHOT表只产生一次事件 g_wTimerID = timeSetEvent(10, timeRes, (LPTIMECALLBACK)SendFun, (DWORD)this, TIME_PERIODIC); if(g_wTimerID == 0)return
 false;return true;}/******************************************************************\ function name : DestroyTimer desc : destroy the timer created by calling CreateTimer argument void ret code void\******************************************************************/void
 CIExample0042aDlg::DestroyTimer()//关闭时调用该函数{timeKillEvent(g_wTimerID);timeEndPeriod(timeRes);}void CALLBACK SendFun(UINT wTimerID, UINT msg, DWORD dwUser, DWORD dwl, DWORD dw2){CIExample0042aDlg *timer =(CIExample0042aDlg *)dwUser;timer->SendMessage(WM_UPDATETIME,0,0);//由于这是个静态函数,所以这里调用了另一个函数,响应中断消息//这里即为1ms中断的回调函数}

添加响应消息
ON_MESSAGE(WM_UPDATETIME,&OnUpdateTime)      //创建消息映射
响应消息函数
afx_msg LRESULT CIExample0042aDlg::OnUpdateTime(WPARAM, LPARAM)
{
	//响应1ms中断消息的函数,可以添加处理函数
	return TRUE;
}

当关闭程序时,需要kill多媒体定时器,否则会报错

void CIExample0042aDlg::OnDestroy() 
{
	CDialog::OnDestroy();	
	DestroyTimer();
}
同样需要添加消息

ON_WM_DESTROY()


下面就是程序时间测试的函数,还是比较准确的

LARGE_INTEGER   litmp; 
LONGLONG   QPart1;
LONGLONG   QPart2;
double   dfMinus,   dfFreq,   dfTim; 
CString time_his;
void CIExample0042aDlg::Time_Start(){ if(start_tim==1){QueryPerformanceFrequency(&litmp); //获得计数器的时钟频率 dfFreq = (double)litmp.QuadPart; QueryPerformanceCounter(&litmp); //获得初始值    QPart1 = litmp.QuadPart; }}void CIExample0042aDlg::Time_Stop()//CIExample0042aDlg::{if(start_tim==1){QueryPerformanceCounter(&litmp); //获得中止值 QPart2 = litmp.QuadPart; dfMinus = (double)(QPart2 - QPart1);//获得对应的时间值 dfTim = dfMinus / dfFreq; CString strrr,strrr1; strrr.Format("%.3lf", dfTim*1000); time_his+=strrr;time_his+="ms\r\n";m_time.SetWindowText(time_his);m_time.LineScroll(m_time.GetLineCount()); }}


其中start_tim连接了一个button,用来控制是否启动时间检测。m_time是文本框,可以显示时间。

使用方法

Time_Start();
//需要测试的代码
Time_Stop();


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dongganxiao_maidou/article/details/77440053

智能推荐

io---BufferedOutputStream_flush-缓冲区写出字节时的缓冲区问题_outputstream怎么开启缓冲区_biu_biubiubiu的博客-程序员秘密

package io;import java.io.BufferedOutputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;/**缓冲区写出字节时的缓冲区问题@author W*/public class Buff...

(转)[kaili linux]安装kaili linux到VM_jameskaron的博客-程序员秘密

转自:http://www.yishimei.cn/network/782.htmlkaili linux iso:https://www.kali.org/downloads/上次给大家介绍了关于黑客专用系统Kali Linux后,有许多小伙伴都表现出了极大的兴趣,但是想要彻底深入的学习Kali Linux,不仅要知道它的用途与大概介绍,更要亲身实践才能学到真正的黑客技能,考虑到...

JVM(三)--垃圾收集算法_想飞的盗版鱼的博客-程序员秘密

JVM(三)–垃圾收集算法这篇博客的内容包括:一、垃圾收集算法:1,标记——清除算法:2,复制算法:3,标记——整理算法:4,分代收集算法:二、涉及到的问题:1,标记清除,标记整理,复制算法分别是什么,各有什么缺点2,新生代和老年代各用什么算法?3,为什么要划分新生代和老年代?4,新生代分为什么?年轻代为什么分为Eden和Survior区?5,新生代和老年代的年龄阈值是多少?初识GC自动垃圾回收机制,简单来说就是寻找 Java堆中的无用对象。打个比方:你的房间是

adb实用命令(持续更新中....)_潇曜的博客-程序员秘密

1、获取手机屏幕当前显示的activity名与所属的包名:adb shell dumpsys window windows | findstr Current【延伸阅读】有人会有疑问:adb shell dumsys后面可以接哪些参数呢?其实很简单,我们在cmd中输入以下命令:adb shell service list,就会显示可以显示的参数:Found 178 services:0 ...

互联网产品设计进阶(10)关注项目的赢利模式_cndes的博客-程序员秘密

互联网产品设计进阶(10)关注赢利模式整天都在思考项目的进展,忙碌了一天,终于有点时间来打理思绪。晚上收到一封快件,收到一位编辑朋友送来的几本书,里面有一本最近比较热门的《设计原本》。读一本书时,我喜欢看书的前言,因为这里反映了作者的原始动机。正如书中所写,“思维的过程、人与人的

webpack配置: 如何同时使用ES2015和JSX_weixin_34281477的博客-程序员秘密

为什么80%的码农都做不了架构师?>>> ...

随便推点

Intellij IDEA使用junit单元测试及其junit与spring版本不兼容问题_idea 和junit不兼容_oldbig_lin的博客-程序员秘密

Intellij IDEA自动创建单元测试,这在我之前的博客已有介绍  IntelliJ IDEA中用快捷键自动创建测试类下面是我在创建springboot测试类中的说明和遇到的问题创建好了测试类后1.测试service层测试类需要加上注解:@Runwith,@SpringBootTest2.测试Controller层测试类需要加上注解:@Runwith,@SpringB

sas:利用SQL连接表_中年英雄王叔叔的博客-程序员秘密

基本语句:select variable1, variable2, variable3.....from tablewhere condition1 and/or condition2....group by variable1, variable2, variable3......having condition1, condition2.....order by va

2023版最新最强大数据面试宝典_数据人生coding的博客-程序员秘密

2023年最新大数据面试宝典,目前已更新到第4版,广受好评!

java模拟实现一个基于文本界面的——客户信息管理系_junit 按照设计要求编写customerview,逐一实现各种方法_码走江湖的博客-程序员秘密

一:项目介绍介绍:模拟实现一个基于文本界面的——客户信息管理系 类和对象(属性、方法及构造器) 类的封装 引用数组 数组的插入、删除和替换 多对象协同工作 该简易系统能够实现对客户对象的插入、修改和删除(用数组实现),并能够打印客户明细表项目采用分级菜单方式。1、主菜单如下:—————–客户信息管理软件—————– 1 ...

epochs,batch_size,iterations的理解_qq_40938646的博客-程序员秘密

对于这几个参数,一直不怎么理解,每次写一个小demo都要一个个百度是什么意思。为了能够记住,决定自己写一遍,这样影响更深刻,也能更好的理解,虽然这类的博客很多,但是每个人喜欢的格式都不一样,希望可以帮到跟我一样的人。Batch首先说batch size,就要说到深度学习的算法,梯度下降。下面是梯度下降的几种方法:这几种梯度下降最大不同点在于什么时候更新损失函数,关于损失函数...