一个简单高精度定时器设计

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
	}  

}

运行效果图:

猜你喜欢

转载自blog.csdn.net/HQ354974212/article/details/85008114
今日推荐