发信人: wuliao999() 
整理人: wenbobo(2002-12-27 15:55:46), 站内信件
 | 
 
 
前几天在这里我提了一些编程中遇到的问题,如精确定时(0.1秒级)等,得到
  了大家的热情帮助,但都不是令人满意的解决方案。最后我在codeguru解决了
 问题,现在把结果公布出来,希望对大家有用。
 /***************mmtimers.h********************/
 #ifndef	___multimedia_timers___
 #define	___multimedia_timers___
 
 #include	<mmsystem.h>
 
 class CMMTimers
 {
 public:
 	CMMTimers(UINT resolution);
 	virtual ~CMMTimers();
 
 	UINT	getTimerRes() { return timerRes; };
 
 	bool	startTimer(UINT period,bool oneShot);
 	bool	stopTimer();
 
 	virtual void timerProc() {};
 
 protected:
 	UINT	timerRes;
 	UINT	timerId;
 };
 
 #endif
 
 /***************mmtimers.cpp**********************/
 #include	"StdAfx.h"
 #include	"mmTimers.h"
 
 CMMTimers::CMMTimers(UINT resolution) : timerRes(0), timerId(0)
 {
 	TIMECAPS	tc;
 
 	if (TIMERR_NOERROR == timeGetDevCaps(&tc,sizeof(TIMECAPS)))
 	{
 		timerRes = min(max(tc.wPeriodMin,resolution),tc.wPeriodMax);
 		timeBeginPeriod(timerRes);
 	}
 }
 
 CMMTimers::~CMMTimers()
 {
 	stopTimer();
 	if (0 != timerRes)
 	{
 		timeEndPeriod(timerRes);
 		timerRes = 0;
 	}
 }
 
 
 extern "C" void CALLBACK
 internalTimerProc(UINT id,UINT msg,DWORD dwUser,DWORD dw1,DWORD dw2)
 {
 	CMMTimers *	timer = (CMMTimers *)dwUser;
 
 	timer->timerProc();
 }
 
 bool CMMTimers::startTimer(UINT period,bool oneShot)
 {
 	bool		res = false;
 	MMRESULT	result;
 
 	result = timeSetEvent(period,timerRes,internalTimerProc,(DWORD)this,o neShot ? TIME_ONESHOT : TIME_PERIODIC);
 	if (NULL != result)
 	{
 		timerId = (UINT)result;
 		res = true;
 	}
 
 	return res;
 }
 
 bool CMMTimers::stopTimer()
 {
 	MMRESULT	result;
 
 	result = timeKillEvent(timerId);
 	if (TIMERR_NOERROR == result)
 		timerId = 0;
 
 	return TIMERR_NOERROR == result;
 }
 /*******************end*************************/
 实际上它只是封装了SDK的multimedia timer函数,在MSDN中也讲到了,只是
 不太容易找到。使用时只需设置3个参数:1、定时器步长,也就是每单位时间
 的长度,以毫秒为单位,在构造函数中设,如CMMTimers myTimer(50);
 2、定时时间长度,以毫秒为单位,3、定时类型(BOOL),TRUE中断1次;
 FALSE循环中断,如myTimer.startTimer(100,FALSE);中断处理在timerProc()
 函数中写。
 经我的初步测试,1小时误差小于1秒,对一般应用应足够了。
  -- ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 61.139.86.104]
  | 
 
 
 |