• <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 的定時器封裝類

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

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

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

            h文件

               1: #pragma once
               2:  
               3:  
               4: /*
               5:  *    無窗口的定時器方案
               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; //定時器id 映射到定時器的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:會導(dǎo)致DeleteTimerQueueEx等待所有的timer對應(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)會在處理函數(shù)調(diào)用完成后自動刪除這個定時器
              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 閱讀(1030) 評論(0)  編輯 收藏 引用 所屬分類: C++ win32/MFC

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            留言簿

            隨筆分類(23)

            隨筆檔案(26)

            文章分類(1)

            文章檔案(1)

            csdn

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            99久久无色码中文字幕| 久久精品国产亚洲AV电影| 国产伊人久久| 久久天天躁狠狠躁夜夜av浪潮| 日本加勒比久久精品| 久久久久亚洲av综合波多野结衣| 2019久久久高清456| 狠狠88综合久久久久综合网| 国产日韩欧美久久| 久久精品国产亚洲AV久| 996久久国产精品线观看| 深夜久久AAAAA级毛片免费看| 亚洲中文字幕久久精品无码喷水 | 日韩十八禁一区二区久久| 久久亚洲AV无码精品色午夜| 久久一日本道色综合久久| 99久久精品国产高清一区二区| 久久综合九色综合欧美就去吻| 97久久超碰国产精品2021| 中文成人无码精品久久久不卡 | 色青青草原桃花久久综合| 国产精品久久久天天影视| 一本久久免费视频| 久久久国产一区二区三区| 久久AV高清无码| 亚洲综合精品香蕉久久网| 伊人久久五月天| 久久亚洲高清综合| 青青草国产精品久久| 91精品国产9l久久久久| 人妻无码久久一区二区三区免费| 久久91精品国产91| 久久最新免费视频| 天天影视色香欲综合久久| 国产毛片久久久久久国产毛片| 久久99国产精一区二区三区| 无码人妻久久一区二区三区免费| 免费久久人人爽人人爽av| 香蕉久久夜色精品国产尤物| 蜜臀久久99精品久久久久久| 久久久久亚洲AV无码专区网站 |