• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            小步慢跑

             

            基于 TimerQueue 的定時(shí)器封裝類

            本來以為是很簡(jiǎn)單的事,沒想到又牽涉出了線程池,APC,內(nèi)核定時(shí)器對(duì)象一大堆沒搞明白的知識(shí)。先把代碼保存下。牽涉到的知識(shí)再慢慢消化。

            主要使用了以下 API。這些API還是有不少的陷阱(注意點(diǎn))的,《windows 核心編程》的第11章有詳細(xì)的解釋。

               1: CreateTimerQueue
               2: DeleteTimerQueueEx
               3:  
               4: CreateTimerQueueTimer
               5: DeleteTimerQueueTimer

            h文件

               1: #pragma once
               2:  
               3:  
               4: /*
               5:  *    無窗口的定時(shí)器方案
               6:  */
               7:  
               8: #include "singleton.h" 
               9:  
              10: typedef tr1::function<void(DWORD dwID,DWORD dwUserData)> TimerFunObj;
              11:  
              12: class CTimerMgr
              13: {
              14: public:
              15:     CTimerMgr(void);
              16:     ~CTimerMgr(void);
              17:  
              18:  
              19: public:
              20:     bool SetTimer(DWORD dwID,DWORD dwElapse,TimerFunObj,DWORD dwUserData);
              21:     bool KillTimer(DWORD dwID);
              22:  
              23: private:
              24:  
              25:     typedef map<DWORD ,HANDLE>  MAP_ID_2_HANDLE;
              26:     MAP_ID_2_HANDLE m_mapTimerID2Handle; //定時(shí)器id 映射到定時(shí)器的handle
              27:  
              28:     HANDLE m_hTimerQueue;
              29: };
              30:  
              31: typedef Singleton<CTimerMgr> TimerService;
              32:  
              33: struct TCBParam
              34: {
              35:     CTimerMgr*  m_pThis;
              36:     DWORD       m_dwTimerID;
              37:     TimerFunObj m_func;
              38:     DWORD       m_dwUserData;
              39: };
              40: extern void _stdcall  TimerCBProc(PVOID lpParamter,BOOL TimerorWaitFired);

             

            cpp文件

               1: #include "StdAfx.h"
               2: #include "TimerMgr.h"
               3:  
               4:  
               5: CTimerMgr::CTimerMgr(void):m_hTimerQueue(NULL)
               6: {
               7:     m_hTimerQueue = ::CreateTimerQueue();
               8:     VERIFY(NULL != m_hTimerQueue);
               9: }
              10:  
              11:  
              12: CTimerMgr::~CTimerMgr(void)
              13: {
              14:     if (NULL != m_hTimerQueue)
              15:     {
              16:         // INVALID_HANDLE_VALUE:會(huì)導(dǎo)致DeleteTimerQueueEx等待所有的timer對(duì)應(yīng)的回調(diào)方法完成后再返回
              17:         DeleteTimerQueueEx(m_hTimerQueue,NULL);
              18:     }
              19: }
              20:  
              21: // dwElapse :milliseconds
              22: bool CTimerMgr::SetTimer( DWORD dwID,DWORD dwElapse,TimerFunObj timerfunc,DWORD dwUserData)
              23: {
              24:     VERIFY(NULL != m_hTimerQueue);
              25:     
              26:     TCBParam* ptParam     = new TCBParam;
              27:     ptParam->m_pThis      = this;
              28:     ptParam->m_dwTimerID  = dwID;
              29:     ptParam->m_func       = timerfunc;
              30:     ptParam->m_dwUserData = dwUserData;
              31:  
              32:     HANDLE hTimer = NULL;
              33:     if( 0 != CreateTimerQueueTimer(&hTimer,m_hTimerQueue,(WAITORTIMERCALLBACK)TimerCBProc,(void*)ptParam,dwElapse,0,WT_EXECUTEDEFAULT))
              34:     {
              35:         m_mapTimerID2Handle[dwID] = hTimer;
              36:         return true;
              37:     }
              38:     else //失敗
              39:     {
              40:         delete ptParam;
              41:         ptParam = NULL;
              42:         return false;
              43:     }
              44:  
              45: }
              46:  
              47: bool CTimerMgr::KillTimer( DWORD dwID )
              48: {
              49:     MAP_ID_2_HANDLE::iterator it = m_mapTimerID2Handle.find(dwID);
              50:  
              51:     if (it == m_mapTimerID2Handle.end())//不存在
              52:         return false;
              53:         
              54:     HANDLE hTimer = it->second;
              55:     BOOL bSuc = ( 0 != ::DeleteTimerQueueTimer(m_hTimerQueue,hTimer,NULL) );
              56:  
              57:     if (bSuc )
              58:     {
              59:         m_mapTimerID2Handle.erase(it);
              60:         return true;
              61:     }
              62:     //之前定義的處理函數(shù)即將被調(diào)用或正在被調(diào)用,立刻返回,但系統(tǒng)會(huì)在處理函數(shù)調(diào)用完成后自動(dòng)刪除這個(gè)定時(shí)器
              63:     else if (ERROR_IO_PENDING ==  GetLastError())
              64:     {
              65:         m_mapTimerID2Handle.erase(it);
              66:         return true;
              67:     }
              68:     else
              69:     {
              70:         return false;
              71:     }
              72:         
              73:         
              74:     
              75:     
              76: }
              77:  
              78:  
              79: void _stdcall TimerCBProc( PVOID lpParamter,BOOL TimerorWaitFired )
              80: {
              81:     TCBParam* ptParam = (TCBParam*)lpParamter;
              82:     if (NULL == ptParam)
              83:         return;
              84:     CTimerMgr*  pThis      = ptParam->m_pThis;
              85:     DWORD       dwTimerID  = ptParam->m_dwTimerID;
              86:     TimerFunObj funcTimer  = ptParam->m_func;
              87:     DWORD       dwUserData = ptParam->m_dwUserData;
              88:  
              89:     funcTimer(dwTimerID,dwUserData);
              90:     
              91:     delete ptParam;
              92:     ptParam = NULL;
              93: }

            調(diào)用代碼:

               1: class CInvoker
               2: {
               3: public:
               4:     void TimerProc(DWORD dwID,DWORD dwUserData )
               5:     {
               6:         //...
               7:     }
               8: }
               9:  
              10: CInvoker _invoker;
              11: TimerFunObj  proc = tr1::bind(&CInvoker::TimerProc,&_invoker,tr1::placeholders::_1,tr1::placeholders::_2);

            posted on 2012-08-14 19:09 zaccheo 閱讀(1043) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++ win32/MFC

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿

            隨筆分類(23)

            隨筆檔案(26)

            文章分類(1)

            文章檔案(1)

            csdn

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            WWW婷婷AV久久久影片| 狠狠色丁香婷婷综合久久来来去| a高清免费毛片久久| 久久久久四虎国产精品| 久久久久亚洲AV成人网人人软件| 国产精品美女久久久久av爽| 久久久精品人妻无码专区不卡| 久久伊人五月丁香狠狠色| 久久妇女高潮几次MBA| 美女写真久久影院| 久久99久久99精品免视看动漫| 久久最近最新中文字幕大全 | 久久精品国产99国产精品亚洲| 国产婷婷成人久久Av免费高清| 人人狠狠综合久久亚洲高清| 国产精品久久久久久吹潮| 久久人人爽人人爽人人片AV麻豆| 麻豆成人久久精品二区三区免费 | 精品久久久久一区二区三区| 狠狠色综合网站久久久久久久高清 | 亚洲午夜久久久影院伊人| 狠狠精品久久久无码中文字幕 | 久久99精品久久久久婷婷| 一级做a爰片久久毛片毛片| 久久综合狠狠综合久久激情 | 亚洲国产另类久久久精品小说| 老司机国内精品久久久久| 国产成人精品综合久久久| 久久精品国产99久久久香蕉| …久久精品99久久香蕉国产| 久久久国产99久久国产一| 久久午夜综合久久| 国内精品久久久久久久coent | 亚洲乱亚洲乱淫久久| 久久精品九九亚洲精品| 欧洲精品久久久av无码电影| 色综合久久综合中文综合网| 麻豆AV一区二区三区久久| 久久亚洲欧美国产精品| 久久久久99精品成人片欧美| 日韩人妻无码精品久久久不卡 |