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

            導航

            統計

            常用鏈接

            留言簿

            隨筆分類(23)

            隨筆檔案(26)

            文章分類(1)

            文章檔案(1)

            csdn

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲日本va午夜中文字幕久久| 一本一本久久a久久综合精品蜜桃| 伊人久久大香线蕉综合网站| 久久亚洲国产午夜精品理论片 | 精品国产VA久久久久久久冰| 国内精品伊人久久久久AV影院| 香蕉久久av一区二区三区| 亚洲av伊人久久综合密臀性色 | 精品久久久无码中文字幕| 久久无码AV中文出轨人妻| 久久久亚洲AV波多野结衣| 久久久青草久久久青草| 国产成人无码精品久久久免费| 久久久噜噜噜久久中文字幕色伊伊 | 亚洲va久久久噜噜噜久久男同| 久久久久亚洲Av无码专| 久久青青草原精品国产不卡 | 理论片午午伦夜理片久久| 久久久国产打桩机| 久久精品a亚洲国产v高清不卡| 777米奇久久最新地址| 午夜精品久久久久成人| 99久久精品午夜一区二区| 91久久精品电影| 亚洲国产精品无码久久| 久久青草国产手机看片福利盒子| 久久精品国产72国产精福利| 中文字幕人妻色偷偷久久| 91精品国产综合久久精品| 国产激情久久久久影院老熟女免费| 激情久久久久久久久久| 欧美黑人激情性久久| 久久人人爽人人爽人人片AV东京热 | 色欲久久久天天天综合网| 久久九九久精品国产免费直播| 久久婷婷人人澡人人爽人人爱| 久久久久人妻一区二区三区vr| 久久九九久精品国产免费直播| 久久久亚洲欧洲日产国码aⅴ| 久久久久久久综合综合狠狠| 91久久精品91久久性色|