日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

网狐定时器引擎分析

發(fā)布時(shí)間:2024/4/11 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 网狐定时器引擎分析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

先貼出來網(wǎng)狐源碼:

#ifndef WH_THREAD_HEAD_FILE #define WH_THREAD_HEAD_FILE#pragma once#include "ServiceCoreHead.h"////線程對象 class SERVICE_CORE_CLASS CWHThread {//狀態(tài)變量 private:volatile bool m_bRun; //運(yùn)行標(biāo)志//線程變量 private:UINT m_uThreadID; //線程標(biāo)識(shí)HANDLE m_hThreadHandle; //線程句柄//函數(shù)定義 protected://構(gòu)造函數(shù)CWHThread();//析構(gòu)函數(shù)virtual ~CWHThread();//接口函數(shù) public://獲取狀態(tài)virtual bool IsRuning();//啟動(dòng)線程virtual bool StartThread();//終止線程virtual bool ConcludeThread(DWORD dwMillSeconds);//功能函數(shù) public://線程標(biāo)識(shí)UINT GetThreadID() { return m_uThreadID; }//線程句柄HANDLE GetThreadHandle() { return m_hThreadHandle; }//投遞消息LRESULT PostThreadMessage(UINT uMessage, WPARAM wParam, LPARAM lParam);//事件函數(shù) protected://運(yùn)行事件virtual bool OnEventThreadRun() { return true; }//開始事件virtual bool OnEventThreadStrat() { return true; }//終止事件virtual bool OnEventThreadConclude() { return true; }//內(nèi)部函數(shù) private://線程函數(shù)static unsigned __stdcall ThreadFunction(LPVOID pThreadData); };//#endif


#include "StdAfx.h" #include "WHThread.h"// //結(jié)構(gòu)定義//啟動(dòng)參數(shù) struct tagThreadParameter {bool bSuccess; //是否錯(cuò)誤HANDLE hEventFinish; //事件句柄CWHThread * pServiceThread; //線程指針 };////構(gòu)造函數(shù) CWHThread::CWHThread() {//設(shè)置變量m_bRun=false;m_uThreadID=0;m_hThreadHandle=NULL;return; }//析構(gòu)函數(shù) CWHThread::~CWHThread() {//停止線程ConcludeThread(INFINITE);return; }//狀態(tài)判斷 bool CWHThread::IsRuning() {//運(yùn)行檢測if (m_hThreadHandle==NULL) return false;if (WaitForSingleObject(m_hThreadHandle,0)!=WAIT_TIMEOUT) return false;return true; }//啟動(dòng)線程 bool CWHThread::StartThread() {//效驗(yàn)狀態(tài)ASSERT(IsRuning()==false);if (IsRuning()==true) return false;//清理變量if (m_hThreadHandle!=NULL) {//關(guān)閉句柄CloseHandle(m_hThreadHandle);//設(shè)置變量m_uThreadID=0;m_hThreadHandle=NULL;}//變量定義tagThreadParameter ThreadParameter;ZeroMemory(&ThreadParameter,sizeof(ThreadParameter));//設(shè)置變量ThreadParameter.bSuccess=false;ThreadParameter.pServiceThread=this;ThreadParameter.hEventFinish=CreateEvent(NULL,FALSE,FALSE,NULL);//效驗(yàn)狀態(tài)ASSERT(ThreadParameter.hEventFinish!=NULL);if (ThreadParameter.hEventFinish==NULL) return false;//啟動(dòng)線程m_bRun=true;m_hThreadHandle=(HANDLE)::_beginthreadex(NULL,0,ThreadFunction,&ThreadParameter,0,&m_uThreadID);//錯(cuò)誤判斷if (m_hThreadHandle==INVALID_HANDLE_VALUE){CloseHandle(ThreadParameter.hEventFinish);return false;}//等待事件WaitForSingleObject(ThreadParameter.hEventFinish,INFINITE);CloseHandle(ThreadParameter.hEventFinish);//判斷錯(cuò)誤if (ThreadParameter.bSuccess==false){ConcludeThread(INFINITE);return false;}return true; }//停止線程 bool CWHThread::ConcludeThread(DWORD dwMillSeconds) {//停止線程if (IsRuning()==true){//設(shè)置變量m_bRun=false;//停止等待if (WaitForSingleObject(m_hThreadHandle,dwMillSeconds)==WAIT_TIMEOUT){return false;}}//設(shè)置變量if (m_hThreadHandle!=NULL){//關(guān)閉句柄CloseHandle(m_hThreadHandle);//設(shè)置變量m_uThreadID=0;m_hThreadHandle=NULL;}return true; }//投遞消息 LRESULT CWHThread::PostThreadMessage(UINT uMessage, WPARAM wParam, LPARAM lParam) {//狀態(tài)效驗(yàn)ASSERT((m_uThreadID!=0)&&(m_hThreadHandle!=NULL));if ((m_uThreadID==0)||(m_hThreadHandle==NULL)) return false;//投遞消息if (::PostThreadMessage(m_uThreadID,uMessage,wParam,lParam)==FALSE){DWORD dwLastError=GetLastError();return dwLastError;}return 0L; }//線程函數(shù) unsigned __stdcall CWHThread::ThreadFunction(LPVOID pThreadData) {//隨機(jī)種子srand((DWORD)time(NULL));//變量定義tagThreadParameter * pThreadParameter=(tagThreadParameter *)pThreadData;CWHThread * pServiceThread=pThreadParameter->pServiceThread;//啟動(dòng)通知try{pThreadParameter->bSuccess=pServiceThread->OnEventThreadStrat(); } catch (...){//設(shè)置變量ASSERT(FALSE);pThreadParameter->bSuccess=false;}//設(shè)置事件bool bSuccess=pThreadParameter->bSuccess;ASSERT(pThreadParameter->hEventFinish!=NULL);if (pThreadParameter->hEventFinish!=NULL) SetEvent(pThreadParameter->hEventFinish);//線程處理if (bSuccess==true){//線程運(yùn)行while (pServiceThread->m_bRun){ #ifndef _DEBUG//運(yùn)行版本try{if (pServiceThread->OnEventThreadRun()==false){break;}}catch (...) { } #else//調(diào)試版本if (pServiceThread->OnEventThreadRun()==false){break;} #endif}//停止通知try{ pServiceThread->OnEventThreadConclude();} catch (...) { ASSERT(FALSE); }}//中止線程_endthreadex(0L);return 0L; }//

#ifndef TIMERENGINE_HEAD_FILE #define TIMERENGINE_HEAD_FILE#pragma once//系統(tǒng)頭文件#include "KernelEngineHead.h" #include "QueueServiceEvent.h"#define TIMER_SPACE 25 //時(shí)間間隔//類說明 class CTimerEngine;////定時(shí)器線程 class CTimerThread : public CWHThread {//變量定義 protected:CTimerEngine * m_pTimerEngine; //定時(shí)器引擎//函數(shù)定義 public://構(gòu)造函數(shù)CTimerThread(void);//析構(gòu)函數(shù)virtual ~CTimerThread(void);//功能函數(shù) public://配置函數(shù)bool InitThread(CTimerEngine * pTimerEngine);//重載函數(shù) private://運(yùn)行函數(shù)virtual bool OnEventThreadRun(); };////定時(shí)器子項(xiàng) struct tagTimerItem {DWORD wTimerID; //定時(shí)器 IDDWORD dwElapse; //定時(shí)時(shí)間DWORD dwTimeLeave; //倒計(jì)時(shí)間DWORD dwRepeatTimes; //重復(fù)次數(shù)WPARAM wBindParam; //綁定參數(shù) };//定時(shí)器子項(xiàng)數(shù)組定義 typedef CWHArray<tagTimerItem *> CTimerItemPtr;////定時(shí)器引擎 class CTimerEngine : public ITimerEngine {friend class CTimerThread;//狀態(tài)變量 protected:bool m_bService; //運(yùn)行標(biāo)志CTimerItemPtr m_TimerItemFree; //空閑數(shù)組CTimerItemPtr m_TimerItemActive; //活動(dòng)數(shù)組//組件變量 protected:CCriticalSection m_CriticalSection; //線程鎖CTimerThread m_TimerThread; //定時(shí)器線程IQueueServiceSink * m_pIQueueServiceSink; //通知回調(diào)//函數(shù)定義 public://構(gòu)造函數(shù)CTimerEngine(void);//析構(gòu)函數(shù)virtual ~CTimerEngine(void);//基礎(chǔ)接口 public://釋放對象virtual VOID Release() { if (IsValid()) delete this; }//是否有效virtual bool IsValid() { return AfxIsValidAddress(this, sizeof(CTimerEngine)) ? true : false; }//接口查詢virtual void * QueryInterface(const IID & Guid, DWORD dwQueryVer);//接口函數(shù) public://設(shè)置定時(shí)器virtual bool SetTimer(DWORD dwTimerID, DWORD dwElapse, DWORD dwRepeat, WPARAM dwBindParameter);//刪除定時(shí)器virtual bool KillTimer(DWORD dwTimerID);//刪除定時(shí)器virtual bool KillAllTimer();//設(shè)置接口virtual bool SetTimerEngineEvent(IUnknownEx * pIUnknownEx);//管理接口 public://開始服務(wù)virtual bool StartService();//停止服務(wù)virtual bool ConcludeService();//內(nèi)部函數(shù) private://定時(shí)器通知void OnTimerThreadSink(); };//#endif
#include "StdAfx.h" #include "TimerEngine.h" #include "TraceService.h" ////宏定義 #define NO_TIME_LEFT DWORD(-1) //不響應(yīng)時(shí)間////構(gòu)造函數(shù) CTimerThread::CTimerThread(void) {m_pTimerEngine = NULL; }//析構(gòu)函數(shù) CTimerThread::~CTimerThread(void) { }//配置函數(shù) bool CTimerThread::InitThread(CTimerEngine * pTimerEngine) {if (pTimerEngine == NULL) return false;//設(shè)置變量m_pTimerEngine = pTimerEngine;return true; }//運(yùn)行函數(shù) bool CTimerThread::OnEventThreadRun() {ASSERT(m_pTimerEngine != NULL);Sleep(TIMER_SPACE);m_pTimerEngine->OnTimerThreadSink();return true; }////構(gòu)造函數(shù) CTimerEngine::CTimerEngine(void) {m_bService = false;m_pIQueueServiceSink = NULL; }//析構(gòu)函數(shù) CTimerEngine::~CTimerEngine(void) {INT_PTR i = 0;//停止服務(wù)ConcludeService();//清理內(nèi)存tagTimerItem * pTimerItem = NULL;for (i = 0; i < m_TimerItemFree.GetCount(); i++){pTimerItem = m_TimerItemFree[i];ASSERT(pTimerItem != NULL);SafeDelete(pTimerItem);}for (i = 0; i < m_TimerItemActive.GetCount(); i++){pTimerItem = m_TimerItemActive[i];ASSERT(pTimerItem != NULL);SafeDelete(pTimerItem);}m_TimerItemFree.RemoveAll();m_TimerItemActive.RemoveAll();return; }//接口查詢 void * CTimerEngine::QueryInterface(const IID & Guid, DWORD dwQueryVer) {QUERYINTERFACE(ITimerEngine, Guid, dwQueryVer);QUERYINTERFACE_IUNKNOWNEX(ITimerEngine, Guid, dwQueryVer);return NULL; }//設(shè)置定時(shí)器 bool CTimerEngine::SetTimer(DWORD dwTimerID, DWORD dwElapse, DWORD dwRepeat, WPARAM dwBindParameter) {DEBUG_GUARD;//鎖定資源CWHDataLocker lock(m_CriticalSection);////效驗(yàn)參數(shù)ASSERT(dwRepeat > 0L);if (dwRepeat == 0) return false;//查找定時(shí)器bool bTimerExist = false;tagTimerItem * pTimerItem = NULL;for (INT_PTR i = 0; i < m_TimerItemActive.GetCount(); i++){pTimerItem = m_TimerItemActive[i];ASSERT(pTimerItem != NULL);if (pTimerItem->wTimerID == dwTimerID){bTimerExist = true;break;}}//創(chuàng)建定時(shí)器if (bTimerExist == false){INT_PTR nFreeCount = m_TimerItemFree.GetCount();if (nFreeCount > 0){pTimerItem = m_TimerItemFree[nFreeCount-1];ASSERT(pTimerItem != NULL);m_TimerItemFree.RemoveAt(nFreeCount - 1);}else{try{pTimerItem = new tagTimerItem;ASSERT(pTimerItem != NULL);if (pTimerItem == NULL) return false;}catch (...){return false;}}}//設(shè)置參數(shù)ASSERT(pTimerItem != NULL);pTimerItem->wTimerID = dwTimerID;pTimerItem->wBindParam = dwBindParameter;pTimerItem->dwElapse = dwElapse;pTimerItem->dwRepeatTimes = dwRepeat;//提前20個(gè)粒度進(jìn)行通知 - TIMER_SPACE * 20if (pTimerItem->dwRepeatTimes == 1)pTimerItem->dwTimeLeave = __max(TIMER_SPACE, pTimerItem->dwElapse - TIMER_SPACE * 20);elsepTimerItem->dwTimeLeave = pTimerItem->dwElapse;//激活定時(shí)器if (bTimerExist == false)m_TimerItemActive.Add(pTimerItem);return true; }//刪除定時(shí)器 bool CTimerEngine::KillTimer(DWORD dwTimerID) {DEBUG_GUARD;//鎖定資源CWHDataLocker lock(m_CriticalSection);////查找定時(shí)器tagTimerItem * pTimerItem = NULL;for (INT_PTR i = 0; i < m_TimerItemActive.GetCount(); i++){pTimerItem = m_TimerItemActive[i];ASSERT(pTimerItem != NULL);if (pTimerItem->wTimerID == dwTimerID){m_TimerItemActive.RemoveAt(i);m_TimerItemFree.Add(pTimerItem);return true;;}}return false; }//刪除定時(shí)器 bool CTimerEngine::KillAllTimer() {//鎖定資源CWHDataLocker lock(m_CriticalSection);////刪除定時(shí)器m_TimerItemFree.Append(m_TimerItemActive);m_TimerItemActive.RemoveAll();return true; }//開始服務(wù) bool CTimerEngine::StartService() {//效驗(yàn)狀態(tài)if (m_bService == true){CTraceService::TraceString(TEXT("定時(shí)器引擎重復(fù)啟動(dòng),啟動(dòng)操作忽略"), TraceLevel_Warning);return true;}//設(shè)置變量if (m_TimerThread.InitThread(this) == false){CTraceService::TraceString(TEXT("定時(shí)器引擎線程服務(wù)初始化失敗"), TraceLevel_Exception);return false;}//啟動(dòng)服務(wù)if (m_TimerThread.StartThread() == false){CTraceService::TraceString(TEXT("定時(shí)器引擎線程服務(wù)啟動(dòng)失敗"), TraceLevel_Exception);return false;}SetThreadPriority(m_TimerThread.GetThreadHandle(), REALTIME_PRIORITY_CLASS);//設(shè)置變量m_bService = true;return true; }//停止服務(wù) bool CTimerEngine::ConcludeService() {//設(shè)置變量m_bService = false;//停止線程m_TimerThread.ConcludeThread(INFINITE);//設(shè)置變量m_TimerItemFree.Append(m_TimerItemActive);m_TimerItemActive.RemoveAll();return true; }//設(shè)置接口 bool CTimerEngine::SetTimerEngineEvent(IUnknownEx * pIUnknownEx) {//效驗(yàn)參數(shù)ASSERT(pIUnknownEx != NULL);ASSERT(m_bService == false);if (m_bService == true) return false;if (pIUnknownEx == NULL) return false;//設(shè)置接口ASSERT(pIUnknownEx != NULL);m_pIQueueServiceSink = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IQueueServiceSink);ASSERT(m_pIQueueServiceSink != NULL);return (m_pIQueueServiceSink != NULL); }//定時(shí)器通知 void CTimerEngine::OnTimerThreadSink() {DEBUG_GUARD;//緩沖鎖定CWHDataLocker lock(m_CriticalSection);////查詢定時(shí)器tagTimerItem * pTimerItem = NULL;for (INT_PTR i = m_TimerItemActive.GetCount() - 1; i >= 0; i--){//效驗(yàn)參數(shù)pTimerItem = m_TimerItemActive[i];ASSERT(pTimerItem != NULL);if (pTimerItem == NULL) return;ASSERT(pTimerItem->dwTimeLeave > 0);//定時(shí)器處理bool bKillTimer = false;pTimerItem->dwTimeLeave -= TIMER_SPACE;if (pTimerItem->dwTimeLeave <= 0L){//設(shè)置次數(shù)if (pTimerItem->dwRepeatTimes != TIMES_INFINITY){ASSERT(pTimerItem->dwRepeatTimes > 0);pTimerItem->dwRepeatTimes--;if (pTimerItem->dwRepeatTimes == 0L){bKillTimer = true;m_TimerItemActive.RemoveAt(i);m_TimerItemFree.Add(pTimerItem);}}//設(shè)置時(shí)間if (bKillTimer == false)//提前20個(gè)粒度進(jìn)行通知 - TIMER_SPACE * 20{if (pTimerItem->dwRepeatTimes == 1)pTimerItem->dwTimeLeave = __max(TIMER_SPACE, pTimerItem->dwElapse - TIMER_SPACE * 20);elsepTimerItem->dwTimeLeave = pTimerItem->dwElapse;}try{//BYTE cbBuffer[MAX_ASYNCHRONISM_DATA] = {0}; //接收緩沖//匿名BYTE cbBuffer[sizeof(NTY_TimerEvent)] = {0}; //接收緩沖//投遞消息NTY_TimerEvent * pTimerEvent = (NTY_TimerEvent *)cbBuffer;pTimerEvent->dwTimerID = pTimerItem->wTimerID;pTimerEvent->dwBindParameter = pTimerItem->wBindParam;m_pIQueueServiceSink->OnQueueServiceSink(EVENT_TIMER, cbBuffer, sizeof(NTY_TimerEvent));}catch (...) { }}} }////建立對象函數(shù) extern "C" __declspec(dllexport) void * CreateTimerEngine(const GUID & Guid, DWORD dwInterfaceVer) {//建立對象CTimerEngine * pTimerEngine = NULL;try{pTimerEngine = new CTimerEngine();if (pTimerEngine == NULL) throw TEXT("創(chuàng)建失敗");void * pObject = pTimerEngine->QueryInterface(Guid, dwInterfaceVer);if (pObject == NULL) throw TEXT("接口查詢失敗");return pObject;}catch (...) {}//清理對象SafeDelete(pTimerEngine);return NULL; }//
解讀CWHThread類:
說是CWHThread類感覺它更像一個(gè)接口,要想使用此類必須重新寫一個(gè)類繼承它。重寫OnEventThreadRun()函數(shù),(OnEventThreadStrat和OnEventThreadConclude是可選重載),不明白IsRuning()和StartThread()和ConcludeThread三個(gè)函數(shù)為什么設(shè)為虛函數(shù),感覺這三個(gè)函數(shù)沒有重寫的必要。線程函數(shù)設(shè)為私有的,這是因?yàn)轭悓ο蟛豢赡苷{(diào)用該函數(shù),此函數(shù)只共本類其他函數(shù)內(nèi)部調(diào)用。由于線程函數(shù)要嗎是全局函數(shù),要嗎是靜態(tài)成員函數(shù),本類就是一個(gè)線程,所以本類的線程函數(shù)是靜態(tài)成員函數(shù)。這個(gè)靜態(tài)成員函數(shù)有本類的StartThread成員函數(shù)調(diào)用。那么ThreadFunction去掉什么函數(shù)呢?讓他掉用成員函數(shù)OnEventThreadRun,只要我們子類重新OnEventThreadRun函數(shù)就可以達(dá)到做任何業(yè)務(wù)的目的。那么問題就出來了,OnEventThreadRun函數(shù)是個(gè)靜態(tài)成員函數(shù),他如何調(diào)用本類的非靜態(tài)成員函數(shù)呢,本代碼提供了一種很好的機(jī)制,ThreadFunction函數(shù)加個(gè)參數(shù),參數(shù)之一是指向CWHThread實(shí)例的類指針,通過這個(gè)指針再去調(diào)用成員函數(shù),長見識(shí)了。


解讀CWHThread類:


類互相纏繞的問題:
CWHThread的子類CTimerThread,專為CTimerEngine定制的子類,為什么這樣說呢,因?yàn)轭怌TimerThread除了在CTimerEngine類里面有個(gè)實(shí)例外,此類不再會(huì)有其他實(shí)例。我們大眼一看,CTimerThread類里面包含了CTimerEngine類實(shí)例指針的屬性,CTimerEngine里面包含了CTimerThread類的實(shí)例屬性。這種開發(fā)方式采用了impl技術(shù)。(類CTimerEngine為了訪問類CTimerThread的私有函數(shù)OnEventThreadRun把類CTimerThread添加為自己的友元類,再次不再贅述)。下面分析一下類互相纏繞的原因,類CTimerThread必須有個(gè)屬性是CTimerEngine類的指針或者對象,因?yàn)橹挥羞@樣它才會(huì)知道線程要干什么活(干活方式是用自己的成員函數(shù)OnEventThreadRun調(diào)用類CTimerEngine的成員函數(shù))。接著是類CTimerEngine為什么會(huì)包含類CTimerThread的實(shí)例,用通俗的話來說就是類CTimerEngine會(huì)告訴類CTimerThread給誰在干活,以及什么時(shí)候開始干,具體到代碼就是CTimerEngine類成員函數(shù)StartService調(diào)用m_TimerThread.InitThread(this)告訴類CTimerThread在給誰干活,m_TimerThread.StartThread()告訴類CTimerThread什么時(shí)候開始干。





總結(jié)

以上是生活随笔為你收集整理的网狐定时器引擎分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。