技术标签: 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;
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()); }}CString time_his;
其中start_tim连接了一个button,用来控制是否启动时间检测。m_time是文本框,可以显示时间。
使用方法
Time_Start(); //需要测试的代码 Time_Stop();
package io;import java.io.BufferedOutputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;/**缓冲区写出字节时的缓冲区问题@author W*/public class Buff...
转自:http://www.yishimei.cn/network/782.htmlkaili linux iso:https://www.kali.org/downloads/上次给大家介绍了关于黑客专用系统Kali Linux后,有许多小伙伴都表现出了极大的兴趣,但是想要彻底深入的学习Kali Linux,不仅要知道它的用途与大概介绍,更要亲身实践才能学到真正的黑客技能,考虑到...
JVM(三)–垃圾收集算法这篇博客的内容包括:一、垃圾收集算法:1,标记——清除算法:2,复制算法:3,标记——整理算法:4,分代收集算法:二、涉及到的问题:1,标记清除,标记整理,复制算法分别是什么,各有什么缺点2,新生代和老年代各用什么算法?3,为什么要划分新生代和老年代?4,新生代分为什么?年轻代为什么分为Eden和Survior区?5,新生代和老年代的年龄阈值是多少?初识GC自动垃圾回收机制,简单来说就是寻找 Java堆中的无用对象。打个比方:你的房间是
1、获取手机屏幕当前显示的activity名与所属的包名:adb shell dumpsys window windows | findstr Current【延伸阅读】有人会有疑问:adb shell dumsys后面可以接哪些参数呢?其实很简单,我们在cmd中输入以下命令:adb shell service list,就会显示可以显示的参数:Found 178 services:0 ...
互联网产品设计进阶(10)关注赢利模式整天都在思考项目的进展,忙碌了一天,终于有点时间来打理思绪。晚上收到一封快件,收到一位编辑朋友送来的几本书,里面有一本最近比较热门的《设计原本》。读一本书时,我喜欢看书的前言,因为这里反映了作者的原始动机。正如书中所写,“思维的过程、人与人的
为什么80%的码农都做不了架构师?>>> ...
Intellij IDEA自动创建单元测试,这在我之前的博客已有介绍 IntelliJ IDEA中用快捷键自动创建测试类下面是我在创建springboot测试类中的说明和遇到的问题创建好了测试类后1.测试service层测试类需要加上注解:@Runwith,@SpringBootTest2.测试Controller层测试类需要加上注解:@Runwith,@SpringB
基本语句:select variable1, variable2, variable3.....from tablewhere condition1 and/or condition2....group by variable1, variable2, variable3......having condition1, condition2.....order by va
2023年最新大数据面试宝典,目前已更新到第4版,广受好评!
一:项目介绍介绍:模拟实现一个基于文本界面的——客户信息管理系 类和对象(属性、方法及构造器) 类的封装 引用数组 数组的插入、删除和替换 多对象协同工作 该简易系统能够实现对客户对象的插入、修改和删除(用数组实现),并能够打印客户明细表项目采用分级菜单方式。1、主菜单如下:—————–客户信息管理软件—————– 1 ...
vue中特殊的键盘修饰符,不必去记特定的keyCode:@keyup.13 == @[email protected] == @[email protected] == @keyup.delete (捕获 “删除” 和 “退格” 键)@keyup.27 == @[email protected] == @[email protected] == @k[email protected] == @[email protected] == @[email protected]
对于这几个参数,一直不怎么理解,每次写一个小demo都要一个个百度是什么意思。为了能够记住,决定自己写一遍,这样影响更深刻,也能更好的理解,虽然这类的博客很多,但是每个人喜欢的格式都不一样,希望可以帮到跟我一样的人。Batch首先说batch size,就要说到深度学习的算法,梯度下降。下面是梯度下降的几种方法:这几种梯度下降最大不同点在于什么时候更新损失函数,关于损失函数...