• <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,內核定時器對象一大堆沒搞明白的知識。先把代碼保存下。牽涉到的知識再慢慢消化。

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

               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:會導致DeleteTimerQueueEx等待所有的timer對應的回調方法完成后再返回
              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:     //之前定義的處理函數即將被調用或正在被調用,立刻返回,但系統會在處理函數調用完成后自動刪除這個定時器
              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: }

            調用代碼:

               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 閱讀(1031) 評論(0)  編輯 收藏 引用 所屬分類: C++ 、win32/MFC

            導航

            統計

            常用鏈接

            留言簿

            隨筆分類(23)

            隨筆檔案(26)

            文章分類(1)

            文章檔案(1)

            csdn

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            中文字幕久久精品 | 亚洲成色www久久网站夜月| 久久无码国产| 久久AV无码精品人妻糸列| 久久精品成人免费网站| 内射无码专区久久亚洲| 77777亚洲午夜久久多人| 99久久成人国产精品免费| 久久精品免费大片国产大片| 亚洲中文精品久久久久久不卡| 久久久久四虎国产精品| 精品国产乱码久久久久久人妻 | 免费观看成人久久网免费观看| 久久精品国产色蜜蜜麻豆| 日本久久久久亚洲中字幕| 色婷婷久久久SWAG精品| 国产一区二区精品久久| 久久久久亚洲av成人网人人软件| 欧美日韩中文字幕久久伊人| 成人久久免费网站| 久久婷婷是五月综合色狠狠| 热re99久久精品国产99热| 久久亚洲精品成人AV| 久久久亚洲AV波多野结衣 | 久久青青草原精品国产软件| 久久精品无码专区免费青青| 久久91精品国产91久| 久久久久久青草大香综合精品| 99久久精品日本一区二区免费| 久久精品久久久久观看99水蜜桃| 香蕉久久永久视频| 亚洲国产精品嫩草影院久久 | 精品久久久久久无码专区不卡| 欧美成a人片免费看久久| 久久国产免费| 久久亚洲国产成人影院网站| 久久久久免费视频| 青青久久精品国产免费看| 久久有码中文字幕| 青青草原综合久久大伊人| 欧美一区二区久久精品|