MultiThreadTimer.h
#ifndef MULTI_H
#define MULTI_H
#include <vector>
#include <Windows.h>
#include <process.h>
#include <iostream>
using namespace std;
typedef void(*TimerFunc) (LPVOID);
typedef struct TTimer
{
DWORD ID;//定时器ID
DWORD LastTime;//上次执行时间
DWORD Interval;//定时器的周期
TimerFunc fun;//定时器执行的函数
LPVOID param;//函数的参数
} *pTimer;
unsigned int WINAPI WorkThread(void* param);
class MultiThreadTimer
{
public:
MultiThreadTimer();
~MultiThreadTimer();
bool AddTimer(DWORD ID, DWORD Interval, TimerFunc fun, LPVOID param);
bool DeleteTimer(DWORD ID);
vector<pTimer> GetTimerList();
bool GetFlag();
HANDLE GetThreadHandle();
private:
vector<pTimer> m_vec;
int m_TimerCount;//定时器数量
bool m_suspend_flag;//工作线程是否挂起
unsigned int m_ThreadID;//线程ID;
bool m_flag;//当flag为false时退出线程
HANDLE m_hThread;//线程句柄
};
#endif
MultiThreadTimer.cpp
#include "MultiThreadTimer.h"
MultiThreadTimer::MultiThreadTimer()
{
m_TimerCount = 0;
m_suspend_flag = false;
m_flag = true;
m_hThread=(HANDLE)_beginthreadex(NULL, 0, WorkThread, this, CREATE_SUSPENDED, &m_ThreadID);
}
vector<pTimer> MultiThreadTimer::GetTimerList()
{
return m_vec;
}
MultiThreadTimer::~MultiThreadTimer()
{
//结束线程
m_flag = false;
CloseHandle(m_hThread);
//进行必要的清理工作
for (vector<pTimer>::iterator it = m_vec.begin(); it != m_vec.end();)
{
pTimer p = *it;
it = m_vec.erase(it);
delete p;
}
}
bool MultiThreadTimer::GetFlag()
{
return m_flag;
}
bool MultiThreadTimer::AddTimer(DWORD ID, DWORD Interval, TimerFunc fun, LPVOID param)
{
//加定时器之前必须判断有无重复ID
if (Interval == 0 || ID == 0)
{
return false;
}
bool repeat = false;
for (vector<pTimer>::iterator it = m_vec.begin(); it != m_vec.end(); ++it)
{
if ((*it)->ID == ID)
{
repeat = true;
break;
}
}
if (repeat)
{
return false;
}
else
{
pTimer p = new TTimer;
p->fun = fun;
p->Interval = Interval;
p->ID = ID;
p->LastTime = GetTickCount();
p->param = param;
m_vec.push_back(p);
}
//当加进第一个定时器的时候,启动线程
if (m_vec.size() == 1)
{
ResumeThread(m_hThread);
}
}
HANDLE MultiThreadTimer::GetThreadHandle()
{
return m_hThread;
}
bool MultiThreadTimer::DeleteTimer(DWORD ID)
{
if (ID == 0)
{
return false;
}
//加定时器之前必须判断有无重复ID
bool repeat = false;
for (vector<pTimer>::iterator it = m_vec.begin(); it != m_vec.end();)
{
if ((*it)->ID == ID)
{
pTimer p = *it;
it = m_vec.erase(it);
delete p;
if (m_vec.size() == 0)
{
SuspendThread(m_hThread);
}
return true;
}
else
{
++it;
}
}
return false;
}
unsigned int WINAPI WorkThread(void* param)
{
MultiThreadTimer* p = (MultiThreadTimer*)param;
vector<pTimer> m_vec;
cout << p->GetFlag();
while (p->GetFlag())
{
m_vec = p->GetTimerList();
for (vector<pTimer>::iterator it = m_vec.begin(); it != m_vec.end(); ++it)
{
DWORD now = GetTickCount();
if (now - (*it)->LastTime >= (*it)->Interval)
{
(*it)->LastTime = now;
(*it)->fun((*it)->param);
}
}
Sleep(10);
}
return 0;
}
使用实例
#include"MultiThreadTimer.h"
void Func1 (LPVOID param);
void Func2 (LPVOID param);
int main()
{
MultiThreadTimer mtt;
mtt.AddTimer(1, 10000, Func1, NULL);
mtt.AddTimer(2, 2000, Func2, NULL);
system("pause");
return 0;
}
void Func1(LPVOID param)
{
cout << "你好";
}
void Func2(LPVOID param)
{
cout << "lyf";
}