版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HQ354974212/article/details/85008114
下面设计了一个轻量的高精度定时器类,主要使用timeGetTime()函数:
DWORD timeGetTime(VOID);
返回系统时间,以毫秒为单位。系统时间是从系统启动到调用函数时所经过的毫秒数。注意,这个值是32位的,会在0到2^32之间循环,约49.71天。
代码设计非常简单,需要配合一个while(true)循环来使用, 这个循环你当然可以放到一个线程中:
#include <iostream>
#include<Windows.h>
#include <Mmsystem.h>
#pragma comment(lib, "Winmm.lib")
class CTimer
{
public:
CTimer()
{
m_nSpace = 0;
m_fLeave = 0;
m_dwRepeat = 0;
}
void StartTimer(float nSapce, DWORD dwRepeat)
{
m_nSpace = nSapce;
m_fLeave = nSapce ;
m_dwRepeat = dwRepeat;
}
bool Update(float dt)
{
if (m_dwRepeat != 0)
{
m_fLeave -= dt;
if (m_fLeave <= 0)
{
m_dwRepeat--;
m_fLeave = m_nSpace ;
return true;
}
}
return false;
}
private:
float m_nSpace;
float m_fLeave;
DWORD m_dwRepeat;
};
int main()
{
DWORD m_LastUpdate= timeGetTime();
CTimer t1;
t1.StartTimer(1, 30/*如果想无限次,取DWORD最大值*/);// 每1秒触发一次,重复三十次
CTimer t2;
t2.StartTimer(5, 3 );// 每5秒触发一次,重复三次
while (true)
{
DWORD time = timeGetTime(); //从系统启动到调用函数时所经过的毫秒数。
float TimeStep = (time - m_LastUpdate) * 0.001f;//仔细体会这里的0.001 , 5000毫秒*0.001 =5秒
m_LastUpdate = time;
if (t1.Update(TimeStep)) printf("\n t1触发一次");
if (t2.Update(TimeStep)) printf("\n t2触发一次");
Sleep(1);
}
}
运行效果图: