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

            導航

            統計

            常用鏈接

            留言簿

            隨筆分類(23)

            隨筆檔案(26)

            文章分類(1)

            文章檔案(1)

            csdn

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            国产色综合久久无码有码| 久久99热狠狠色精品一区| 久久综合成人网| 久久精品国产亚洲AV影院| 久久精品亚洲精品国产色婷| 久久精品国产亚洲欧美| 久久精品一区二区三区中文字幕| 伊色综合久久之综合久久| 亚洲AV无码成人网站久久精品大| 欧美伊香蕉久久综合类网站| 武侠古典久久婷婷狼人伊人| 久久狠狠高潮亚洲精品| 亚洲综合久久夜AV | 狠狠色噜噜狠狠狠狠狠色综合久久| 久久乐国产精品亚洲综合| 新狼窝色AV性久久久久久| 久久午夜福利电影| 久久青青草原综合伊人| 无码AV中文字幕久久专区| 久久精品无码av| 亚洲狠狠综合久久| 99久久er这里只有精品18| 久久人妻无码中文字幕| 人妻少妇精品久久| 久久亚洲欧洲国产综合| 久久亚洲综合色一区二区三区| 中文字幕久久精品无码| 少妇人妻综合久久中文字幕| 国产精品热久久无码av| 国产精品一久久香蕉产线看| 中文字幕无码精品亚洲资源网久久| 久久精品无码一区二区三区免费| 久久国产精品国产自线拍免费| 精品久久久久久久国产潘金莲| 亚洲国产成人精品女人久久久| 久久精品国产一区二区三区| 一本一道久久精品综合| 一级做a爰片久久毛片16| 精品国产青草久久久久福利| 国产毛片久久久久久国产毛片| 一本久久久久久久|