近期项目中数据监控较多,故着手写了一个定时器类,功能比较简单,仅为满足当前项目。
基类Thread:
Thread.h
CustomTimer.h
实现回调函数:
基类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();
注:功能实现过程中,查阅一些前辈资料,没有记录作者地址,请原作者见谅。