zoukankan      html  css  js  c++  java
  • 一个ACE 架构的 C++ Timer

    .h

    #ifndef _Timer_Task_
    #define _Timer_Task_
    
    #pragma once
     
    #include <ace/Task.h>
    #include <ace/Singleton.h>
    #include <ace/Null_Mutex.h>
    //#include <ace/OS_NS_Thread.h>
    
    typedef int (*pfnTimerTriggerEvent)(void *pContext);
    
    class TimerTask : public ACE_Task_Base
    {
    friend class ACE_Singleton<TimerTask, ACE_Null_Mutex>;
    public:
        TimerTask(void);
        ~TimerTask(void);
    
    public:
        virtual int svc ();
    
    public: 
        int Start(pfnTimerTriggerEvent pTriggerEvent, void* pContext = NULL);
        int Stop();
        /* Seconds */
        int ResetTimer(int nElapsedInterval);
    
    public:
        int m_nElapsedInterval;
    
    private:
        bool m_bStop; 
        ACE_event_t m_hResetEvent;
    
    private:
        pfnTimerTriggerEvent m_pTriggerEvent;
        void *m_pContext;
    };
    typedef ACE_Singleton<TimerTask, ACE_Null_Mutex> TimerTaskSingleton;
    #define TIMERTASK TimerTaskSingleton::instance()
    
    #endif //_Timer_Task_

    .cpp

    #include "TimerTask.h"
    //#include <ace/Thread_Manager.h>
    //#include <ace/Time_Value.h>
    
    
    TimerTask::TimerTask(void)
        : m_bStop(true),
        m_pContext(NULL),
        m_pTriggerEvent(NULL),
        m_nElapsedInterval(3)
    {
    }
    TimerTask::~TimerTask(void)
    {
        Stop();
    }
    
     
    int TimerTask::svc()
    {
        if (NULL == m_pTriggerEvent) 
            return -1;
    
        ACE_Time_Value tTimeOut(m_nElapsedInterval);
        while (!m_bStop)
        {
            int iRet = ACE_OS::event_timedwait(&m_hResetEvent, &tTimeOut, 0);
            if (m_bStop) 
                break; 
    
            if (0 == iRet) 
                continue; 
    
            if (ETIME == ACE_OS::last_error())
            {
                m_pTriggerEvent(m_pContext);
            }
        } 
        return 0;
    }
    
    int TimerTask::Start(pfnTimerTriggerEvent pTriggerEvent, void* pContext)
    {  
        if (NULL == pTriggerEvent) 
            return -1;
    
        m_pContext = pContext;
        m_pTriggerEvent = pTriggerEvent;
    
        if (ACE_OS::event_init(&m_hResetEvent, 0, 0) != 0) 
            return -1;
    
        m_bStop = false;
        if (activate(THR_NEW_LWP | THR_JOINABLE |THR_INHERIT_SCHED) != 0) 
            return -1; 
        return 0;
    }
    
    int TimerTask::Stop()
    {
        if (!m_bStop)
        {
            m_bStop = true;
            ACE_OS::event_signal(&m_hResetEvent);
            wait(); 
            ACE_OS::event_destroy(&m_hResetEvent); 
        } 
        return 0;
    }
     
    int TimerTask::ResetTimer(int nElapsedInterval)
    {
        m_nElapsedInterval = nElapsedInterval;
        return ACE_OS::event_signal(&m_hResetEvent);
    }  
  • 相关阅读:
    组员信息
    软件工程第四次作业
    软件工程第三次作业
    软件工程第二次作业——git的使用
    现代软件工程 第一章概论习题第1题 李艳薇
    代软件工程 第一章概论习题第10题 李艳薇
    现代软件工程 第一章概论习题第8题 李艳薇
    现代软件工程 第一章概论习题第5题 李艳薇
    现代软件工程 第一章概论习题第3,7,12题 陈宗雷
    计算机芯片的发展历史——软件工程第一章第11题 范世良
  • 原文地址:https://www.cnblogs.com/wjshan0808/p/6612257.html
Copyright © 2011-2022 走看看