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);
    }  
  • 相关阅读:
    9.20 kali中的Metasploit生成木马控制windows 以及http协议相关
    9.19 接上一篇,jss
    9.18 DNS服务安装
    9.17 ubuntu安装LAMP服务
    线程的安全问题
    java实现多线程(上)
    异常处理
    抽象方法和接口、内部类
    面向对象的一些关键字和方法
    Object类和包装类的一些方法
  • 原文地址:https://www.cnblogs.com/wjshan0808/p/6612257.html
Copyright © 2011-2022 走看看