c++ 定时器 (简单功能实现)

近期项目中数据监控较多,故着手写了一个定时器类,功能比较简单,仅为满足当前项目。
基类Thread:
Thread.h   
#include <Windows.h>
class Thread
{
public:
	Thread(void);
	virtual ~Thread(void);

	virtual void  Run() = 0;
	void Start();
	void Stop();
	BOOL IsStop();
protected:
	static DWORD WINAPI ThreadProc(LPVOID pParam);
private:
	BOOL m_bStopFlag;
	HANDLE m_hThread;
};
Thread.cpp
#include "Thread.h"
Thread::Thread()
	:m_bStopFlag(FALSE)
	,m_hThread(INVALID_HANDLE_VALUE)
{
}

Thread::~Thread(void)
{
	Stop();
}

void Thread::Start()
{
	unsigned long *p = NULL;
	m_hThread = CreateThread(NULL,0,ThreadProc,this,0,p);
}

DWORD WINAPI Thread::ThreadProc(LPVOID pParam)
{
	Thread* thread = (Thread*)pParam;
	thread->Run();

	CloseHandle(thread->m_hThread);
	thread->m_hThread = INVALID_HANDLE_VALUE;
	return 0;
}

void Thread::Stop()
{
	m_bStopFlag = TRUE;
	if (m_hThread != INVALID_HANDLE_VALUE)
	{
		if (WaitForSingleObject(m_hThread,INFINITE) != WAIT_ABANDONED)
		{
			CloseHandle(m_hThread);
		}
		m_hThread = INVALID_HANDLE_VALUE;
	}
}

BOOL Thread::IsStop()
{
	return m_bStopFlag;
}
派生类CustomTimer
CustomTimer.h
#include "thread.h"
typedef void(CALLBACK *Timerfunc)(LPVOID pParam);
typedef Timerfunc TimerHandler;
class CustomTimer :
	public Thread
{
public:
	CustomTimer(void);
	~CustomTimer(void);
	void registerHandler(TimerHandler handler,LPVOID pParam);
	void setInterval(int nMillisecond){m_nInterval = nMillisecond;};
	void Run();
	void Cancel();
private:
	TimerHandler m_handler;
	int m_nInterval;
	LPVOID m_Parameter;
};
CustomTimer.cpp
#include "CustomTimer.h"
CustomTimer::CustomTimer()
	:m_handler(0)
	,m_nInterval(-1)
{
}


CustomTimer::~CustomTimer(void)
{
}

void CustomTimer::registerHandler(TimerHandler handler,LPVOID pParam)
{
	m_handler = handler;
	m_Parameter = pParam;
}

void CustomTimer::Run()
{
	unsigned long tickNow = GetTickCount();
	unsigned long tickLastTime = tickNow;
	while(!IsStop())
	{
		tickNow = GetTickCount();
		if (tickNow - tickLastTime > m_nInterval)
		{
			if (m_handler)
			{
				(*m_handler)(m_Parameter);
			}
			tickLastTime = GetTickCount();
		}
		Sleep(1);
	}
}

void CustomTimer::Cancel()
{
	Stop();
}
使用示例:
实现回调函数:
void CALLBACK RegularFeedback(LPVOID pParam);
注册、设置时间、启动、停止
registerHandler(RegularFeedback,(LPVOID)Object*);
setInterval(Millisecond);
Start();
Cancel();
注:功能实现过程中,查阅一些前辈资料,没有记录作者地址,请原作者见谅。

猜你喜欢

转载自blog.csdn.net/china_zyl/article/details/17226053