linux 仿windows SetTimer

2020-04-21  本文已影响0人  Albert_d37d

//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;

}

上一篇下一篇

猜你喜欢

热点阅读