//CTimerMg.h
#pragma once
#include <pthread.h>
#include <string.h>
#include <unistd.h>
#include <vector>
void * TimerProc(void *arg);
using namespace std;
typedef struct _TimerTask
{
void *(*Func)(int);
int iId;
int iInterval;
int iCountUp;
bool bMarked;
}TimerTask;
class CTimerMg
{
private:
pthread_t m_threadId;
public:
vector<TimerTask> m_vtTimerTasks;
pthread_rwlock_t m_lockRW;
public:
int SetTimer(int iIdEvent, int iInterval,void *(*pFunc)(int)); //回调处理
void KillTimer(int iIdEvent);
void RemoveMarked();
public:
CTimerMg();
~CTimerMg();
};
//CTimerMg.cpp
#include "CTimerMg.h"
void * TimerProc(void * arg)
{
CTimerMg *pTimerMg = (CTimerMg*)arg;
while (true)
{
sleep(1);
pTimerMg->RemoveMarked();
pthread_rwlock_rdlock(&pTimerMg->m_lockRW);
vector<TimerTask>::size_type iSize = pTimerMg->m_vtTimerTasks.size();
for (vector<TimerTask>::size_type i = 0; i < iSize; i++)
{
if (!pTimerMg->m_vtTimerTasks[i].bMarked)
{
pTimerMg->m_vtTimerTasks[i].iCountUp++;
if (pTimerMg->m_vtTimerTasks[i].iCountUp >= pTimerMg->m_vtTimerTasks[i].iInterval)
{
pTimerMg->m_vtTimerTasks[i].Func(pTimerMg->m_vtTimerTasks[i].iId);
pTimerMg->m_vtTimerTasks[i].iCountUp = 0;
}
}
}
pthread_rwlock_unlock(&pTimerMg->m_lockRW);
}
pthread_exit(0);
return NULL;
}
int CTimerMg::SetTimer(int iTimerId,int iInterval ,void *(*pFunc)(int))
{
pthread_rwlock_wrlock(&m_lockRW);
TimerTask tempTask;
tempTask.Func = pFunc;
tempTask.iId = iTimerId;
tempTask.iInterval = iInterval;
tempTask.iCountUp = 0;
tempTask.bMarked = false;
m_vtTimerTasks.push_back(tempTask);
pthread_rwlock_unlock(&m_lockRW);
return 0;
}
void CTimerMg::KillTimer(int iIdEvent)
{
vector<TimerTask>::size_type iSize = m_vtTimerTasks.size();
for (vector<TimerTask>::size_type i = 0; i < iSize; i++)
{
if (m_vtTimerTasks[i].iId == iIdEvent)
{
m_vtTimerTasks[i].bMarked = true;
}
}
}
void CTimerMg::RemoveMarked()
{
pthread_rwlock_wrlock(&m_lockRW);
vector<TimerTask>::size_type iSize = m_vtTimerTasks.size();
for (vector<TimerTask>::size_type i = 0; i < iSize; i++)
{
if (m_vtTimerTasks[i].bMarked)
{
m_vtTimerTasks.erase(m_vtTimerTasks.begin() + i);
}
}
pthread_rwlock_unlock(&m_lockRW);
}
CTimerMg::CTimerMg()
{
pthread_rwlock_init(&m_lockRW, NULL);
int ret = pthread_create(&m_threadId, NULL, TimerProc,(void*)this);
if (ret == -1)
{
strerror(ret);
}
}
CTimerMg::~CTimerMg()
{
pthread_rwlock_destroy(&m_lockRW);
}
//main.cpp
#include <cstdio>
#include <iostream>
#include "CTimerMg.h"
CTimerMg timer;
int iCount = 0;
void *TimerProc(int iTimerId)
{
cout << "my timer " <<iTimerId<< endl;
if (iCount++ == 3) timer.KillTimer(2);
}
int main()
{
timer.SetTimer(1,1, TimerProc);
timer.SetTimer(2, 2, TimerProc);
timer.SetTimer(3, 1, TimerProc);
while (1)
{
}
return 0;
}
网友评论