• <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)拂山崗;他橫由他橫,明月照大江。他自狠來他自惡,我自一口真氣足

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              20 隨筆 :: 47 文章 :: 22 評(píng)論 :: 0 Trackbacks
            Windows系統(tǒng)三種定時(shí)器的分析
            目前,Windows下的定時(shí)器編程主要有三種方式。
            1)SetTimer定時(shí)器是利用Windows窗口消息WM_TIMER來實(shí)現(xiàn)的。使用方法非常簡單,SetTimer創(chuàng)建定時(shí)器,KillTimer銷毀定時(shí)器。使用條件是調(diào)用線程必須要有窗口消息隊(duì)列message queue,因此如果是工作線程就無法使用這種方法。
            2)WaitableTimer定時(shí)器,其實(shí)應(yīng)該算是一種線程同步對(duì)象,CreateWaitableTimer創(chuàng)建定時(shí)器對(duì)象,SetWaitableTimer設(shè)置定時(shí)器回調(diào)函數(shù),CLoseHandle銷毀定時(shí)器。WaitableTimer可以跨線程、進(jìn)程使用,只要知道定時(shí)器對(duì)象名字(創(chuàng)建定時(shí)器時(shí)設(shè)置)就可以控制該定時(shí)器對(duì)象了。WaitableTimer定時(shí)器的回調(diào)函數(shù)實(shí)際上是一個(gè)APC(Asynchronous Procedure Calls)異步過程調(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來創(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)可參見微軟的說明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來完成。
            posted on 2011-06-29 10:46 胡雨田 閱讀(12750) 評(píng)論(2)  編輯 收藏 引用 所屬分類: 編程技巧

            評(píng)論

            # re: Windows系統(tǒng)三種定時(shí)器的分析 2016-07-15 18:32 Apophis
            不是三種,還有另兩種高精度定時(shí)器,其中一種是 timerSetEvent,不過一個(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í)器需求,來準(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è)過程時(shí)會(huì)讓表層程序莫名其妙的卡頓)  回復(fù)  更多評(píng)論
              

            久久精品亚洲精品国产色婷 | 夜夜亚洲天天久久| 伊人久久无码中文字幕| 看久久久久久a级毛片| 99久久er这里只有精品18| 国产精自产拍久久久久久蜜 | 2021国内精品久久久久久影院| 久久精品人妻中文系列| 久久精品www| 亚洲伊人久久成综合人影院| 97精品国产97久久久久久免费| 91精品日韩人妻无码久久不卡 | 久久精品aⅴ无码中文字字幕不卡| 久久A级毛片免费观看| 久久综合成人网| 青青草国产成人久久91网| 午夜精品久久久久久久久| 久久国产福利免费| 国产精品一久久香蕉产线看| 一级做a爰片久久毛片毛片| 99热成人精品免费久久| 久久九九精品99国产精品| 久久精品中文字幕大胸| 国产精品久久久99| 日本道色综合久久影院| 老色鬼久久亚洲AV综合| 久久99九九国产免费看小说| 久久精品二区| 久久精品亚洲男人的天堂| 91亚洲国产成人久久精品网址| 9久久9久久精品| 国产精品福利一区二区久久| 久久久精品国产sm调教网站| 亚洲乱码中文字幕久久孕妇黑人| 久久久国产亚洲精品| 久久这里只精品99re66| 思思久久精品在热线热| 精品久久久久久无码不卡| 久久久久国产精品人妻| 久久精品国产男包| 久久久久久久久久久久中文字幕 |