VC中实现毫秒定时器

2016-02-19 12:59 8 1 收藏

今天天气好晴朗处处好风光,好天气好开始,图老师又来和大家分享啦。下面给大家推荐VC中实现毫秒定时器,希望大家看完后也有个好心情,快快行动吧!

【 tulaoshi.com - 编程语言 】

很久之前就想给Vckbase写点什么东西了,毕业至今,在vckbase中学了不少东西,也拿了不少代码,今天决定要回报一下,不管老婆呆会会不会拧我耳朵了。

毫秒定时器,为什么要使用毫秒定时器呢?我想原因有两个。第一:CWnd里面的timer不能精确到毫秒级,所以必须要写一个精确到毫秒级的。第二:用CWnd里面的timer代价太大,因为有时我们的类根本就没有窗口,为了使用timer,而不得不从CWnd里派生。本人写的这个mmtimer,主要是为了解决上面这两点而设计的。

再加上,这段时间看了一下设计模式,所以基本上这些代码是我这几个月来设计模式的总结,如果写得不好,敬请各位大虾指教。

运行结果如下:

VC中实现毫秒定时器
图一 毫秒定时器

好了我们先来看看实现毫秒定时器的关键技术吧。其实异常的简单,主要用到如下几个函数,(见代码中CMMTimers)

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

1) timeGetDevCaps,得到当前计算机的时间精度。

2) timeBeginPeriod,设定当前定时器的精确度。例如设定为5,表示误差不会大于5毫秒。

3) timeEndPeriod. 跟2相对应,结束了定时精度.

(其实我的这些代码中有没有这三个函数,效果也是一样的)

4) timeSetEvent(...pfn...).开始定时,该函数中,有一个参数时回调函数指针,以及回调函数的参数,我的代码中是internalTimerProc,

和m_Recoder[MMRecoder::nRes](该参数指明定时器ID,一个CMMTimers的指针)

5)timeKillEvent.终止定时器。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

如果对上述函数不理解也没关系,我已经把它们封装成一个类了,对了就叫CMMTimers.

为了使你不必去理解上述这些函数,我作出封装,CMMTimers主要有如下几个函数接口:

1)bool stopTimer(int nTimerID) 作用跟KillTimer(int nTimerID) 一样.

2)bool startTimer(UINT period,CTimerListener *pListener = NULL,int nTimerID = 1,bool oneShot = FALSE);相当于SetTimer(int nTimerID).

nTimerID,就是定时器ID,oneShot就是是否只运行一次,你可能会说CTimerListener是个什么东西,这个下面我再解释。

3)stopTimer(),关闭所有定时器。

4)timerProc()定时响应函数。相当于OnTimer.

说到这里的时候,其实我们现在就可以用这个类了,只不如果我不说CTimerListener是个什么东西,你始终会觉得纳闷。好吧,让我画个UML图好了。

VC中实现毫秒定时器
图二 毫秒定时器 UML图

有了UML图之后,知道CTimerListener是个抽象接口了吧,什么?UML图看不懂?回去看书去,俺可没这个义务教你看UML图呀。

来到这里你就已经知道,只要CtestMMTimerDlg调用StartTimer(),StopTimer(),以及重载OnMMTimer()就OK了,其用法与SetTimer,KillTimer,OnTimer是一样的。

这里CtestMMTimerDlg,的基类是CDialog,而CDialog的基类是CWnd纯属巧合,它其实可以是任何的类,如CStudent,等完全没有窗口的类。

自己看代码吧。如果觉得有何不妥之处请与我联系。

结束语:又一次,老婆在等我完成工作中睡着了.....当程序员的老婆,有时真是惨。

来源:http://www.tulaoshi.com/n/20160219/1602709.html

延伸阅读
滑动控件是Windows中最常用的控件之一。一般而言它是由一个滑动条,一个滑块和可选的刻度组成,用户可以通过移动滑块在相应的控件中显示对应的值。通常,在滑动控件附近一定有标签控件或编辑框控件,用于显示相应的值。滑动控件在应用程序中用途级为广泛,如在桌面的属性中就可以看到。为此,让我们一起来看一下它的实现方法。 (...
VC++中轻松实现滑动控件 作者: 上海同济大学计算机系 小鹰 下载本文示例代码 滑动控件是Windows中最常用的控件之一。一般而言它是由一个滑动条,一个滑块和可选的刻度组成,用户可以通过移动滑块在相应的控件中显示对应的值。通常,在滑动控件附近一定有标签控件或编辑框控件,用...
Timer类:设置一个定时器,定时执行用户指定的函数。 定时器启动后,系统将自动建立一个新的线程,执行用户指定的函数。 初始化一个Timer对象: Timer timer = new Timer(timerDelegate, s,1000, 1000); // 第一个参数:指定了TimerCallback 委托,表示要执行的方法; // 第二个参数:一个包含回调方法要使用的信息的对象,或者为空引用;...
[文章信息]作者:中国电波传播研究所青岛分所郎锐时间:2003-06-16出处:yesky责任编辑:方舟[文章导读]本文给出了一种在Visual C++下用原始套接字来捕捉并分析在网络上传输的数据包的简单方法 引言 从事网络安全的技术人员和相当一部分准黑客(指那些使用现成的黑客软件进行攻击而不是根据需要去自己编写代码的人)都一定不会对网络嗅探器(sn...
1、给程序添加ATL支持。右键-New ATL Object2、实现IDispEventImpl 接口。//EventSink.h#import "..ServerDebugServer.exe" raw_interface_only,no_namespace,named_guidsclass  CEventSink : public IDispEventImpl0, CEventSink,&DIID__IObjEvents,&LIBID_SERVERLib, 1, 0 { public: CEven...

经验教程

546

收藏

79
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部