美文网首页
linux 仿windows SetTimer

linux 仿windows SetTimer

作者: Albert_d37d | 来源:发表于2020-04-21 14:30 被阅读0次

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

    }

    相关文章

      网友评论

          本文标题:linux 仿windows SetTimer

          本文链接:https://www.haomeiwen.com/subject/emxxyqtx.html