zoukankan      html  css  js  c++  java
  • windows 非窗口定时器

    #ifndef _MYTIMER_H_
    #define _MYTIMER_H_
    #include <map>
    #include <set>
    #include <windows.h>
    #include <Mmsystem.h>
    #include <string>
    
    #include "ttype.h"
    #include "lock.h"
    
    #pragma comment(lib, "Winmm.lib")
    
    #define  TIMER_PERIOD 500
    
    class CMyTimer;
    enum emTimeType
    {
        E_TIME_ONESHOT = 0,
        E_TIME_PERIOD  = 1
    };
    
    struct TIMERVAL
    {
        UINT uType;
        UINT uTimeVal;
        UINT uTimeFinal;
        CMyTimer *pCTimer;
    };
    
    
    typedef   std::map<UINT,TIMERVAL>   TimerMap;   
    
    class CMyTimer
    {
    public:
        CMyTimer(void);
        ~CMyTimer(void);
    public:  
        void   KillMyTimer();  
        void   SetOneTimer(UINT nTimeID,UINT nElapse);
        void   SetTimer(UINT nTimeID,UINT nElapse);
    
        static void   SetMyTimerOnce(UINT   nElapse,DWORD dwUser = NULL);
        static void   SetMyTimerPeriod(UINT nElapse,DWORD dwUser = NULL);  
        virtual bool  ontime(UINT nTimeID) = 0;
    
        static CLock    m_lock;
        static       bool       m_bInitTime;
    private:
        MMRESULT   m_nTimerID;
        
        static void    CALLBACK OnTime(UINT uTimerID, UINT uMsg, 
                                DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2);
        static TimerMap TimerMap;
    
    };
    
    #endif 
    #include "MyTimer.h"
    #include <iostream>
    #include <time.h>
    
    using namespace std;
    CMyTimer::CMyTimer(void)
    {
        m_nTimerID = 0;
    }
    
    
    CMyTimer::~CMyTimer(void)
    {
    
    }
    
    TimerMap CMyTimer::TimerMap;
    bool CMyTimer::m_bInitTime = false;
    CLock    CMyTimer::m_lock;
    
    void  CMyTimer::SetMyTimerOnce(UINT nElapse,DWORD dwUser)
    {
        if (m_bInitTime)
        {
            return;
        }
        if (NULL !=  ::timeSetEvent(nElapse,1,OnTime,dwUser,TIME_ONESHOT))
        {
            m_bInitTime = true;
        }
    }
    
    void  CMyTimer::SetMyTimerPeriod(UINT nElapse,DWORD dwUser)
    {
        if (NULL != ::timeSetEvent(nElapse,1,OnTime,dwUser,TIME_PERIODIC))
        {
            m_bInitTime = true;
        }
    }
    
    void    CALLBACK CMyTimer::OnTime(UINT uTimerID, UINT uMsg, 
                                         DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
    {
        CSignedLock lock(&m_lock);
        for (auto iter = TimerMap.begin();
                iter != TimerMap.end();)
        {
            iter->second.uTimeVal += TIMER_PERIOD;
            if (iter->second.uTimeVal >= iter->second.uTimeFinal)
            {
                if (E_TIME_ONESHOT == iter->second.uType) 
                {
                    iter->second.pCTimer->ontime(iter->first);
                    TimerMap.erase(iter++);
                    continue;
                }
                if (E_TIME_PERIOD == iter->second.uType)
                {
                    iter->second.uTimeVal = 0;
                    if (false == iter->second.pCTimer->ontime(iter->first))
                    {
                        TimerMap.erase(iter++);
                        continue;
                    }
                }
            }
            iter++;
        }
        return;
    }
    
    void  CMyTimer:: KillMyTimer()
    {
        ::timeKillEvent(m_nTimerID);
        m_bInitTime = false;
    }
    
    void  CMyTimer::SetOneTimer(UINT nTimeID,UINT nElapse)
    {
        CSignedLock lock(&m_lock);
        auto iter = TimerMap.find(nTimeID);
        if (iter == TimerMap.end())
        {
            TimerMap[nTimeID].pCTimer = this;
            TimerMap[nTimeID].uTimeFinal = nElapse;
            TimerMap[nTimeID].uTimeVal = 0;
            TimerMap[nTimeID].uType = E_TIME_ONESHOT;        
        }
    }
    
    void   CMyTimer::SetTimer(UINT nTimeID,UINT nElapse)
    {
        CSignedLock lock(&m_lock);
        auto iter = TimerMap.find(nTimeID);
        if (iter == TimerMap.end())
        {
            TimerMap[nTimeID].pCTimer = this;
            TimerMap[nTimeID].uTimeFinal = nElapse;
            TimerMap[nTimeID].uTimeVal = 0;
            TimerMap[nTimeID].uType = E_TIME_PERIOD;
        }
    }
    #ifndef _Work_H_
    #define _Work_H_
    #include "MyTimer.h"
    
    enum MyEnum
    {
        E_TIME_ID_1 = 1,
        E_TIME_ID_2 = 2,
        E_TIME_ID_3 = 3,
    
    };
    
    
    class Work :public CMyTimer
    {
    public:
        Work(void);
        ~Work(void);
        bool Init();
        void Run();
        bool unInit();
        void onTime();
        bool time_fun_1();
        bool time_fun_2();
        bool time_fun_3();
    
        bool ontime(UINT nTimeID);
    };
    
    #endif//_Work_H_
    #include "Work.h"
    #include <iostream>
    using namespace std;
    
    Work::Work(void)
    {
    }
    
    
    Work::~Work(void)
    {
    
    }
    
    bool Work::Init()
    {
        if (!CMyTimer::m_bInitTime)
        {
            CMyTimer::SetMyTimerPeriod(TIMER_PERIOD);
        }    
        return true;
    }
    
    void Work::Run()
    {
        SetOneTimer(E_TIME_ID_1,1000);
        SetTimer(E_TIME_ID_2,1000);
    }
    
    bool Work::unInit()
    {
        return true;
    }
    
    bool Work::time_fun_1()
    {
        std::cout<<"只执行一次的定时器"<<__LINE__<<std::endl;
        return true;
    }
    
    bool Work::time_fun_2()
    {
        std::cout<<"每周期执行一次的定时器"<<__LINE__<<std::endl;
        static int i = 0;
        if (++i == 3)
        {
            return false;
        }
        return true;
    }
    
    bool Work::time_fun_3()
    {
        std::cout<<__LINE__<<std::endl;
        return true;
    }
    
    //
    bool Work::ontime(UINT nTimeID)
    {
        switch (nTimeID)
        {
        case E_TIME_ID_1:
            return time_fun_1();
        case E_TIME_ID_2:
            return time_fun_2();
        case E_TIME_ID_3:
            return time_fun_3();
        default:
            break;
        }
        return true;
    }
    ///普通锁定类
    #ifndef _CLOCK_H_
    #define _CLOCK_H_
    
    #include <windows.h>
    class  CLock
    {
        friend class CSignedLock;
    
    private:
        CRITICAL_SECTION                m_csLock;                    ///关键段
    
        ///函数定义
    public:
        ///构造函数
        inline CLock() { ::InitializeCriticalSection(&m_csLock); }
        ///析构函数
        inline ~CLock() { ::DeleteCriticalSection(&m_csLock); }
    
        ///功能函数
    private:
        ///锁定函数
        inline void Lock() { ::EnterCriticalSection(&m_csLock); }
        ///解锁函数 
        inline void UnLock() { ::LeaveCriticalSection(&m_csLock); }
    };
    
    class  CSignedLock
    {
        ///变量定义
    private:
        CLock        * m_pLock;                    ///锁定对象
        int            m_iLockCount;                ///锁定计数
        ///函数定义
    public:
        ///构造函数
        CSignedLock(CLock * pLock)
        {
            m_iLockCount = 0;
            m_pLock = pLock;
            Lock();
        }
        ///析构函数
        ~CSignedLock()
        {
            UnLock();
        }
    
    public:
        ///锁定函数
        inline void Lock()
        {
            if (m_pLock)
            {
                m_iLockCount++;
                m_pLock->Lock();
            }
        }
        ///解锁函数 
        inline void UnLock()
        {
            if (m_pLock)
            {
                m_iLockCount--;
                m_pLock->UnLock();
            }
        }
    };
    
    #endif //_CLOCK_H_
    #ifndef _TTYPE_H_
    #define _TTYPE_H_
    
    typedef  unsigned int UINT;
    
    #define  saferelease(p) {
        if(nullptr != p) {
            delete p ; 
            p = nullptr;
        }
    }
    
    #endif
    #include "work.h"
    #include <windows.h>
    #include <iostream>
    using namespace std;
    
    Work work ;
    
    int main()
    {
        work.Init();
        work.Run();
        system("pause");
        cout<<endl;
    }
  • 相关阅读:
    Python 学习笔记(七)Python字符串(三)
    Python 学习笔记(七)Python字符串(二)
    Python 学习笔记(六)Python第一个程序
    Python 学习笔记(五)常用函数
    Python 学习笔记(四)数字(二)
    行为型模式之责任链模式
    python_frm组件
    django之models学习总结
    HTTP协议
    事件委托
  • 原文地址:https://www.cnblogs.com/wanzaixiaoxin/p/4940678.html
Copyright © 2011-2022 走看看