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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

网狐棋牌(四) TimerEngine

發(fā)布時間:2024/4/11 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 网狐棋牌(四) TimerEngine 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
相關(guān)UML:


CTimerEngine成員變量:
? ??//狀態(tài)變量
? ? DWORD? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???m_dwTimerSpace;? ?? ?? ?? ?? ?? ???//時間間隔,這個值后來應(yīng)該是給了定時器線程
protected:
? ??
bool? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???m_bService;? ?? ?? ?? ?? ?? ?? ?? ?//運行標志
? ? DWORD? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???m_dwTimePass;? ?? ?? ?? ?? ?? ???//經(jīng)過時間
? ? DWORD? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???m_dwTimeLeave;? ?? ?? ?? ?? ?? ???//倒計時間
? ? CTimerItemPtr? ?? ?? ?? ?? ?? ?? ?? ?m_TimerItemFree;? ?? ?? ?? ?? ??//空閑數(shù)組
? ? CTimerItemPtr? ?? ?? ?? ?? ?? ?? ?? ?m_TimerItemActive;? ?? ?? ?? ?? ??//活動數(shù)組

這些是分析定時器線程函數(shù)需要了解的成員變量,其次是線程同步:
從代碼中可以看出所有對:m_TimerItemActive;??m_TimerItemFree;的操作都是在一個線程鎖的保護之下的。


定時器線程:
通過CTimerThread繞一圈以后最終被循環(huán)執(zhí)行的實際上是這個函數(shù)(m_dwTimerSpace控制最小時間):
[cpp]?view plaincopy
  • //定時器通知??
  • void?CTimerEngine::OnTimerThreadSink()??
  • {??
  • ????//鎖定資源??
  • ????CThreadLockHandle?LockHandle(&m_ThreadLock);??
  • ??
  • ????//倒計時間??
  • ????if?(m_dwTimeLeave==NO_TIME_LEFT)???
  • ????{??
  • ????????ASSERT(m_TimerItemActive.GetCount()==0);??
  • ????????return;??
  • ????}??
  • ??
  • ????//減少時間??
  • ????ASSERT(m_dwTimeLeave>=m_dwTimerSpace);??
  • ????m_dwTimeLeave-=m_dwTimerSpace;??
  • ????m_dwTimePass+=m_dwTimerSpace;??
  • ??
  • ????//查詢定時器??
  • ????if?(m_dwTimeLeave==0)??
  • ????{??
  • ????????bool?bKillTimer=false;??
  • ????????tagTimerItem?*?pTimerItem=NULL;??
  • ????????DWORD?dwTimeLeave=NO_TIME_LEFT;??
  • ????????for?(INT_PTR?i=0;i<m_TimerItemActive.GetCount();)??
  • ????????{??
  • ????????????//效驗參數(shù)??
  • ????????????pTimerItem=m_TimerItemActive;??
  • ????????????ASSERT(pTimerItem!=NULL);??
  • ????????????ASSERT(pTimerItem->dwTimeLeave>=m_dwTimePass);??
  • ??
  • ????????????//定時器處理??
  • ????????????bKillTimer=false;??
  • ????????????//?這一行做了--操作??
  • ????????????pTimerItem->dwTimeLeave?-=?m_dwTimePass;??
  • ????????????if?(pTimerItem->dwTimeLeave==0L)??
  • ????????????{??
  • ????????????????//發(fā)送通知??
  • ????????????????m_AttemperEvent.PostTimerEvent(pTimerItem->wTimerID,pTimerItem->wBindParam);??
  • ??
  • ????????????????//設(shè)置次數(shù)??
  • ????????????????if?(pTimerItem->dwRepeatTimes!=TIMER_REPEAT_TIMER)??
  • ????????????????{??
  • ????????????????????ASSERT(pTimerItem->dwRepeatTimes>0);??
  • ????????????????????if?(pTimerItem->dwRepeatTimes==1L)??
  • ????????????????????{??
  • ????????????????????????bKillTimer=true;??
  • ????????????????????????m_TimerItemActive.RemoveAt(i);??
  • ????????????????????????m_TimerItemFree.Add(pTimerItem);??
  • ????????????????????}??
  • ????????????????????else?pTimerItem->dwRepeatTimes--;??
  • ????????????????}??
  • ??
  • ????????????????//設(shè)置時間,從新開始倒計時??
  • ????????????????if?(bKillTimer==false)?pTimerItem->dwTimeLeave=pTimerItem->dwElapse;??
  • ????????????}??
  • ??
  • ????????????//增加索引??
  • ????????????if?(bKillTimer==false)???
  • ????????????{??
  • ????????????????i++;??
  • ????????????????dwTimeLeave=__min(dwTimeLeave,pTimerItem->dwTimeLeave);??
  • ????????????????ASSERT(dwTimeLeave%m_dwTimerSpace==0);??
  • ????????????}??
  • ????????}??
  • ??
  • ????????//設(shè)置響應(yīng)??
  • ????????m_dwTimePass=0L;??
  • ????????m_dwTimeLeave=dwTimeLeave;??
  • ????}??
  • ??
  • ????return;??
  • }??
  • CTimerEngine:
    啟動一個定時器線程,循環(huán)遍歷定時器,如果發(fā)現(xiàn)滿足出發(fā)條件的定時器就投遞一個定時器消息到CQueueServiceEvent對象。

    總結(jié)

    以上是生活随笔為你收集整理的网狐棋牌(四) TimerEngine的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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