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

            久久国产色AV免费看| 国产精自产拍久久久久久蜜| 久久精品综合网| 亚洲精品无码久久一线| 99久久人妻无码精品系列蜜桃| 久久er热视频在这里精品| 久久综合久久鬼色| 久久精品国产亚洲AV嫖农村妇女| 亚洲国产成人久久综合一| AV无码久久久久不卡蜜桃| 久久综合丁香激情久久| 亚洲国产精品无码久久一区二区 | 亚洲国产精品综合久久一线| 少妇内射兰兰久久| 亚洲精品高清一二区久久| 国产精品久久亚洲不卡动漫| 久久无码专区国产精品发布| 国产精品免费久久久久影院| 国内精品久久人妻互换| 中文无码久久精品| 亚洲а∨天堂久久精品9966| 97超级碰碰碰碰久久久久| 久久婷婷五月综合97色一本一本| 亚洲国产成人精品无码久久久久久综合 | 美女久久久久久| 99久久免费国产精品| 97久久精品午夜一区二区| 久久久久久久久久久久中文字幕| 久久人与动人物a级毛片| 无码人妻久久一区二区三区蜜桃| 久久国产精品国产自线拍免费| 久久精品国产亚洲AV无码麻豆| 久久丫忘忧草产品| 久久人人添人人爽添人人片牛牛 | 久久久无码人妻精品无码| 精品综合久久久久久98| 久久精品久久久久观看99水蜜桃 | 日韩欧美亚洲综合久久| 久久夜色精品国产噜噜亚洲a| 久久久这里只有精品加勒比| 亚洲精品无码专区久久同性男|