⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ctimer.cpp

📁 简单的linux下的timer类
💻 CPP
字号:
#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<signal.h>
#include<pthread.h>
#include<time.h>
#include<sys/time.h>

#include "ctimer.h"

int Timer::_iFlag = 0;
TIMER_S *Timer::_pTimeListHead = 0;

Timer::Timer()
{
    _pTimerNodeAddr = NULL;
}

Timer::~Timer()
{
    Clear();
}

int Timer::SetTimer(int iSec, pfTimerCallFunc pfFunc)
{
    TIMER_S *pTemp = new(TIMER_S);
    
    int iRet = 0;
    struct itimerval itv, oldtv;
    
    if (NULL == pTemp || iSec < 1 )
    {
        return -1;
    }

    _pTimerNodeAddr = pTemp;
    
    pTemp->left_time = -1;
    pTemp->total_time = iSec;
    pTemp->pfFunc = pfFunc;    

    HandlNode(pTemp, 1);
    
    if (0 == SetFlag())
    {
        signal(SIGALRM,Catch_Alarm);

        itv.it_interval.tv_sec = 1;
        itv.it_interval.tv_usec = 0;
        itv.it_value.tv_sec = 1;
        itv.it_value.tv_usec = 0;

        setitimer(ITIMER_REAL, &itv, &oldtv);
    }
}

void Timer::Start()
{
    if( NULL != _pTimerNodeAddr)
    {
        _pTimerNodeAddr->left_time = _pTimerNodeAddr->total_time;
    }
}

void Timer::ReStart()
{
    if( NULL != _pTimerNodeAddr)
    {
        _pTimerNodeAddr->left_time = _pTimerNodeAddr->total_time;
    }
}

void Timer::Stop()
{
    if( NULL != _pTimerNodeAddr)
    {
        _pTimerNodeAddr->left_time = -1;
    }
}

void Timer::Clear()
{
    HandlNode(_pTimerNodeAddr, 0);
    return;
}

void Timer::HandlNode(TIMER_S *Node, int iFlag)
{
    TIMER_S *pTemp = NULL;
    TIMER_S *pTempPre = NULL;

    switch(iFlag)
    {
        case 0: /* del node */
        {
            if (NULL == Node || NULL == _pTimeListHead)
            {
                return;
            }
            if( _pTimeListHead == Node)
            {
                _pTimeListHead = Node->pNextNode;
                delete Node;
                Node = NULL;
                return;
            }

            pTemp = _pTimeListHead->pNextNode;
            pTempPre = _pTimeListHead;
            
            while( NULL != pTemp)
            {
                if (pTemp == Node)
                {
                    pTempPre->pNextNode = Node->pNextNode;
                    delete Node;
                    Node = NULL;
                    break;
                }

                pTemp = pTemp->pNextNode;
                pTempPre = pTempPre->pNextNode;
            }
            break;
        }
        
        case 1: /* add node */       
        {
            if( NULL == _pTimeListHead)
            {
                _pTimeListHead = Node;
            }
            else
            {
                Node->pNextNode = _pTimeListHead->pNextNode;
                _pTimeListHead->pNextNode = Node;
            }
            break;
        }
        
        default:
        {
            break;
        }
    }
    return;
    
}

void Timer::Catch_Alarm(int iSig)
{
    
    TIMER_S *pTemp = _pTimeListHead;
        
    while(NULL != pTemp)
    {   
        
        if(pTemp->left_time > 0 )
        {
            pTemp->left_time--;
        }
        else
        {    
            if((0 == pTemp->left_time) && ( NULL != pTemp->pfFunc))
            {
                pTemp->pfFunc(iSig);
                pTemp->left_time=pTemp->total_time;     //循环计时
            }
        }

        pTemp = pTemp->pNextNode;
    }
    return;
    
}

int Timer::SetFlag()
{
    if(0 == _iFlag)
    {
        _iFlag = 1;
        return 0;
    }
    else
    {
        return 1;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -