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

            九九热久久免费视频| 乱亲女H秽乱长久久久| 久久国产成人午夜AV影院| 亚洲国产综合久久天堂 | 国产成人精品久久综合| 亚洲国产成人久久精品动漫| 日韩欧美亚洲国产精品字幕久久久 | 四虎影视久久久免费| 久久国产精品99精品国产| 久久午夜福利电影| 久久er99热精品一区二区| 亚洲国产成人久久精品99| 国产午夜福利精品久久2021| 亚洲国产天堂久久综合| 69SEX久久精品国产麻豆| 久久人人爽人人爽人人爽| 青青草国产成人久久91网| 日韩AV无码久久一区二区| 无码精品久久一区二区三区 | 亚洲伊人久久综合中文成人网| 久久精品aⅴ无码中文字字幕不卡| 亚洲精品国产自在久久| 国内精品久久久久久久影视麻豆| 久久人人妻人人爽人人爽| 久久综合鬼色88久久精品综合自在自线噜噜 | 嫩草影院久久99| 久久丫精品国产亚洲av不卡 | 久久久久久免费视频| 久久久久久青草大香综合精品| 欧洲人妻丰满av无码久久不卡| 亚洲午夜福利精品久久| 亚洲欧美久久久久9999 | 久久99国产精品一区二区| AV无码久久久久不卡网站下载| 99精品久久久久久久婷婷| 久久精品国产亚洲av麻豆图片| 久久午夜夜伦鲁鲁片免费无码影视 | 成人综合久久精品色婷婷| 久久只这里是精品66| 无码八A片人妻少妇久久| 久久久久久久女国产乱让韩|