• <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>

            huyutian

            他強(qiáng)由他強(qiáng),清風(fēng)拂山崗;他橫由他橫,明月照大江。他自狠來(lái)他自惡,我自一口真氣足

              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              20 隨筆 :: 47 文章 :: 22 評(píng)論 :: 0 Trackbacks
            Windows系統(tǒng)三種定時(shí)器的分析
            目前,Windows下的定時(shí)器編程主要有三種方式。
            1)SetTimer定時(shí)器是利用Windows窗口消息WM_TIMER來(lái)實(shí)現(xiàn)的。使用方法非常簡(jiǎn)單,SetTimer創(chuàng)建定時(shí)器,KillTimer銷(xiāo)毀定時(shí)器。使用條件是調(diào)用線程必須要有窗口消息隊(duì)列message queue,因此如果是工作線程就無(wú)法使用這種方法。
            2)WaitableTimer定時(shí)器,其實(shí)應(yīng)該算是一種線程同步對(duì)象,CreateWaitableTimer創(chuàng)建定時(shí)器對(duì)象,SetWaitableTimer設(shè)置定時(shí)器回調(diào)函數(shù),CLoseHandle銷(xiāo)毀定時(shí)器。WaitableTimer可以跨線程、進(jìn)程使用,只要知道定時(shí)器對(duì)象名字(創(chuàng)建定時(shí)器時(shí)設(shè)置)就可以控制該定時(shí)器對(duì)象了。WaitableTimer定時(shí)器的回調(diào)函數(shù)實(shí)際上是一個(gè)APC(Asynchronous Procedure Calls)異步過(guò)程調(diào)用函數(shù)。
            關(guān)于APC方面的知識(shí)可參考“談?wù)剬?duì)APC的一點(diǎn)理解”一文http://blog.csdn.net/wwwwly/archive/2009/07/10/4337907.aspx
            3)TimerQueueTimer定時(shí)器,應(yīng)該算迄今為止Windows系統(tǒng)最強(qiáng)大的定時(shí)器了。他可以支持多種工作模式,而且定時(shí)精度也是最高的。
            使用時(shí),首先要調(diào)用CreateTimerQueue創(chuàng)建一個(gè)定時(shí)器隊(duì)列,然后用
            CreateTimerQueueTimer來(lái)創(chuàng)建一個(gè)TimerQueueTimer定時(shí)器,
            WT_EXECUTEDEFAULT,默認(rèn)設(shè)置,回調(diào)函數(shù)將進(jìn)入一個(gè)非I/O工作線程隊(duì)列
            WT_EXECUTEINTIMERTHREAD,回調(diào)函數(shù)作為APC,在定時(shí)器線程中被調(diào)用,被調(diào)用的條件是線程進(jìn)入可警告等待狀態(tài)alertable wait status。僅適用于短時(shí)任務(wù),否則可能會(huì)影響隊(duì)列中的其他定時(shí)器。
            WT_EXECUTEINIOTHREAD,回調(diào)函數(shù)進(jìn)入一個(gè)I/O工作線程隊(duì)列,
            請(qǐng)注意,大多數(shù)定時(shí)器都需要調(diào)用線程進(jìn)入可警告等待狀態(tài)alertable wait status,并不是隨隨便便就能發(fā)生定時(shí)調(diào)用的。一個(gè)線程是否進(jìn)入可警告等待狀態(tài)可參見(jiàn)微軟的說(shuō)明http://msdn.microsoft.com/en-us/library/ms686307.aspx
            A thread goes into an alertable wait state by calling either SleepEx, MsgWaitForMultipleObjectsEx, WaitForSingleObjectEx, or WaitForMultipleObjectsEx, with the function's bAlertable parameter set to TRUE.
            所以希望定時(shí)器不受這種可警告等待狀態(tài)的影響,最好是用TimerQueue來(lái)完成。
            posted on 2011-06-29 10:46 胡雨田 閱讀(12750) 評(píng)論(2)  編輯 收藏 引用 所屬分類(lèi): 編程技巧

            評(píng)論

            # re: Windows系統(tǒng)三種定時(shí)器的分析 2016-07-15 18:32 Apophis
            不是三種,還有另兩種高精度定時(shí)器,其中一種是 timerSetEvent,不過(guò)一個(gè)進(jìn)程中它只支持創(chuàng)建16個(gè),還有一個(gè)是 mci 的定時(shí)器  回復(fù)  更多評(píng)論
              

            # re: Windows系統(tǒng)三種定時(shí)器的分析 2016-07-15 18:37 Apophis
            另外,TimerQueueTimer 使用中最需注意的密集的短時(shí)調(diào)用,一定仔細(xì)區(qū)分每個(gè)定時(shí)器需求,來(lái)準(zhǔn)確使用WT_*控制其創(chuàng)建線程的情況,如果使用默認(rèn)標(biāo)記或APC形式時(shí),理論上只要能成果創(chuàng)建線程它一定創(chuàng)建線程,最終可能創(chuàng)建出幾百個(gè)線程,反而拖慢程序運(yùn)行(因?yàn)樗浜筮€有消除線程的動(dòng)作,如果當(dāng)時(shí)線程數(shù)奇多,它在執(zhí)行這個(gè)過(guò)程時(shí)會(huì)讓表層程序莫名其妙的卡頓)  回復(fù)  更多評(píng)論
              

            77777亚洲午夜久久多喷| 久久久久久免费视频| 久久久精品午夜免费不卡| 99久久夜色精品国产网站| 久久久精品国产Sm最大网站| 狠狠色丁香婷婷久久综合五月| 婷婷综合久久中文字幕蜜桃三电影| 日韩欧美亚洲综合久久影院d3| 久久精品国产精品亚洲人人| 久久精品亚洲AV久久久无码| 99久久精品费精品国产| 亚洲中文久久精品无码ww16| 国产AV影片久久久久久| 久久精品无码一区二区WWW | 色综合合久久天天给综看| av无码久久久久久不卡网站| 国产69精品久久久久观看软件| 国产精品福利一区二区久久| 久久精品中文无码资源站| 亚洲人成网站999久久久综合| AAA级久久久精品无码区| 成人综合伊人五月婷久久| 亚洲精品无码专区久久久| 青青青青久久精品国产h久久精品五福影院1421 | 亚洲精品乱码久久久久久蜜桃图片 | 99久久精品国产一区二区三区| 久久亚洲美女精品国产精品| 国产精品亚洲综合久久| 久久久无码精品午夜| 久久国产影院| 久久天天躁狠狠躁夜夜2020老熟妇 | 久久综合欧美成人| 精品精品国产自在久久高清 | 亚洲欧美国产日韩综合久久| 久久国产成人午夜aⅴ影院| 国产精品99久久久久久www| 91亚洲国产成人久久精品| 99精品久久久久久久婷婷| 国内精品久久久久久麻豆| 亚洲国产婷婷香蕉久久久久久| 久久夜色精品国产噜噜亚洲a|