精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>技术精解:内存、进程、线程等>>关于精确定时的解决方案

主题:关于精确定时的解决方案
发信人: 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]

[关闭][返回]