亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Windows中定時器Timer使用中的注意事項

2019-11-09 21:17:58
字體:
來源:轉載
供稿:網友

在任何語言任何操作系統下的開發中,定時器都是一個必不可少的功能,大部分的操作系統和語言都有內置的定時器接口可供調用。在windows API中有一組定時器相關函數,包括CreateTimerQueue、DeleteTimerQueue、CreateTimerQueueTimer、DeleteTimerQueueTimer,可以很方便的實現定時器相關功能。

CreateTimerQueue,創建定時器隊列;

DeleteTimerQueue,銷毀定時器隊列;

DeleteTimerQueueEx,銷毀定時器隊列,與上一個函數的區別在于,這個函數的第二個參數可以指定是否等待當前隊列中的回調函數執行完再返回;

CreateTimerQueueTimer,創建定時器;

DeleteTimerQueueTimer,銷毀定時器;

具體函數定義可參見MSDN。

最近在使用這組定時器函數的過程中遇過一個問題,某個線程在調用DeleteTimerQueueTimer函數時block住了,無法正常返回。仔細閱讀MSDN上關于這個函數的說明:

Syntax

C++
BOOL WINAPI DeleteTimerQueueTimer(  _In_opt_ HANDLE TimerQueue,  _In_     HANDLE Timer,  _In_opt_ HANDLE CompletionEvent);

Parameters

TimerQueue [in, optional]

A handle to the timer queue. This handle is returned by the CreateTimerQueue function.

If the timer was created using the default timer queue, this parameter should be NULL.

Timer [in]

A handle to the timer-queue timer. This handle is returned by the CreateTimerQueueTimer function.

CompletionEvent [in, optional]

A handle to the event object to be signaled when the system has canceled the timer and all callback functions have completed. This parameter can be NULL.

If this parameter is INVALID_HANDLE_VALUE, the function waits for any running timer callback functions to complete before returning.

If this parameter is NULL, the function marks the timer for deletion and returns immediately. If the timer has already expired, the timer callback function will run to completion. However, there is no notification sent when the timer callback function has completed. Most callers should not use this option, and should wait for running timer callback functions to complete so they can perform any needed cleanup.

在我的代碼中最后一個參數賦值為INVALID_HANDLE_VALUE而非NULL,也就說會等待任何該定時器的回調函數執行完再返回。從程序的執行log來看,在跑到DeleteTimerQueueTimer這個函數后,定時器的回調函數仍然被調用了很多次,DeleteTimerQueueTimer并沒有在某個回調函數執行完后就正常返回。

由于不知道windows這幾個定時器函數具體如何實現的(如果有哪位高人了解,萬望知悉),只能根據現有現象猜測個大概。

假設某個Timer的執行間隔是1s,那么每隔1s,系統會將它的回調函數放到Timer線程的執行隊列中(CreateTimerQueueTimer的最后一個參數可以指定是否在Timer當前線程執行回調函數),如果當前Timer隊列為空,即前面的回調函數都已執行完畢,那么新加入的回調函數就能夠立即得到執行,這樣這個Timer就處于一個健康狀態,每個回調函數都能在指定時間執行,并在指定時間間隔內返回。

假設一種異常情況,某個Timer的執行間隔為1s,但是它的回調函數會執行2s,那么除了第一次執行,后面的每次調用,都會比原定時間更晚,第二次調用在2s后,晚了1s,第三次調用在4s后,晚了2s,依次類推。如果DeleteTimerQueueTimer這個函數的實現也是把銷毀定時器這個動作放到了Timer線程隊列中,那么Timer的回調函數執行了n次,DeleteTimerQueueTimer的執行就會被相應的推遲n-1s,在n足夠大時,DeleteTimerQueueTimer就會表現為block住,無法返回,不過最終還是能返回的,并不是死循環。

為了印證這種想法,我寫了個很簡單的程序:

VOID CALLBACK TimerCallback( PVOID lpParameter, BOOLEAN TimerOrWaitFired ){ Sleep(100 * 1000); }int main(){ HANDLE timer_queue = CreateTimerQueue(); HANDLE timer; CreateTimerQueueTimer(&timer, timer_queue, TimerCallback, NULL, 0, 10, WT_EXECUTEINTIMERTHREAD); Sleep(100*1000); DeleteTimerQueueEx(timer_queue, INVALID_HANDLE_VALUE); return 0;}

代碼中定時器執行間隔10ms,回調函數會執行100s,然后在開始運行100s后銷毀定時器。然后F5運行,然后......從中午等到半夜12點還是沒返回,就卡在了DeleteTimerQueueEx,這里我很想放個哭瞎的表情,然而好像并不能放動圖。按照我所猜測的定時器實現原理,我算了一下,當前這個函數要等27天半左右才能執行完。。。真是等到天荒地老。

之后稍微了改了下執行參數,定時器執行100ms,運行10s后調用DeleteTimerQueueEx,果然等待時間大大縮短,1分鐘左右就返回了。

從上面這個實驗來看,windows這一組定時器函數的實現原理應該就和我想的差不多。那么了解了原理之后,改問題就好改多了。要避免銷毀定時器時block住,主要有兩個方面需要考慮:

1. 避免回調函數的執行時間超過調用間隔;

2. 避免將所有定時器創建在一個線程中。CreateTimerQueue時,系統會創建一個Timer線程,后面調用CreateTimerQueueTimer時,最后一個參數指定為WT_EXECUTEINTIMERTHREAD時,系統會將該新創建的Timer的回調函數放到默認的Timer線程隊列中。也可以將最后一個參數指定為WT_EXECUTELONGFUNCTION,由系統判斷是否為該定時器的創建新線程,如果定時器的回調函數會執行比較久,那么最好使用這個參數,否則會影響其他定時器的正常運行。

以上就是本人最近使用windows定時器的一些總結,歡迎各路大拿拍磚(隱隱的還是感覺很多有問題的地方)。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久亚洲精品中文字幕冲田杏梨| 久久777国产线看观看精品| 亚洲欧美制服中文字幕| 国产成人一区二区三区| 国产精品久久久久久久久久新婚| 欧美日韩中文字幕综合视频| 国产一区二中文字幕在线看| 亚洲国产精品网站| www高清在线视频日韩欧美| 精品亚洲男同gayvideo网站| 91手机视频在线观看| 中文字幕在线国产精品| 欧美日韩中文字幕综合视频| 亚洲欧美成人一区二区在线电影| 国产亚洲a∨片在线观看| 国产精品激情自拍| 亚洲免费人成在线视频观看| 欧美另类精品xxxx孕妇| 亚洲人成啪啪网站| 欧美成在线观看| 国产精品久久av| 亚洲热线99精品视频| 精品中文视频在线| 少妇av一区二区三区| 91情侣偷在线精品国产| 日韩网站在线观看| 国产精品69久久久久| 欧美日韩国产一区二区三区| 欧美精品videossex88| 姬川优奈aav一区二区| 亚洲专区中文字幕| 91久久久久久久一区二区| 成人激情在线观看| 国产成人精品日本亚洲专区61| 国产精品久久久久久亚洲调教| 欧美精品在线免费观看| 亚洲欧美综合另类中字| 日韩精品视频在线| 日韩电影在线观看永久视频免费网站| 日韩欧美大尺度| 成人综合国产精品| 久久久久999| 欧美日韩国产在线| 欧美性猛交xxxx免费看漫画| 亚洲人成毛片在线播放| 成人写真视频福利网| 国产精品久久久久999| 色偷偷亚洲男人天堂| 亚洲国产中文字幕久久网| 91精品国产网站| 精品网站999www| 136fldh精品导航福利| 亚洲精品电影网| 亚洲一区中文字幕在线观看| 美女扒开尿口让男人操亚洲视频网站| 久久国产精品首页| 日韩精品免费在线视频| 日韩在线观看免费高清完整版| 国产91色在线| 国产中文字幕日韩| 91精品在线观看视频| 国产精品久久久久久久久男| 欧美精品久久久久a| 成人免费直播live| 久久久免费观看| 在线看日韩欧美| 日韩视频免费中文字幕| 国产欧美一区二区三区久久| 91久久久在线| 狠狠躁夜夜躁人人躁婷婷91| 国产成人在线一区二区| 欧美成人免费视频| 17婷婷久久www| 日韩av色综合| 国产91精品久久久| 日韩美女在线播放| 欧美与欧洲交xxxx免费观看| 夜色77av精品影院| 欧美国产日韩视频| 91精品国产色综合久久不卡98| 精品网站999www| 欧美黄色片视频| 国产在线精品自拍| 亚洲一区二区免费在线| 免费成人高清视频| 国产成人自拍视频在线观看| 久久天天躁夜夜躁狠狠躁2022| 久久久久久97| 国产亚洲xxx| 精品久久在线播放| 97热在线精品视频在线观看| 国产精品中文字幕在线观看| 国产精品久久99久久| 久久久免费精品视频| 久久精品人人做人人爽| 国产精品免费一区二区三区都可以| 国产精品视频自拍| 亚洲三级黄色在线观看| 日韩中文字幕免费视频| 亚洲一区二区三区四区在线播放| 欧美高清视频在线| 国产精品久久久久久搜索| 亚洲国产天堂久久国产91| 日韩中文字幕免费视频| 欧美日韩中文在线观看| 亚洲国产精品资源| 91国产精品视频在线| 国产精品久久久久久久久久ktv| 久久精品中文字幕一区| 91色视频在线导航| 国产精品亚洲一区二区三区| 欧美老女人性视频| 日韩性xxxx爱| 国产精品久在线观看| 亚洲国产精品va在线看黑人动漫| 欧美一级大片视频| 欧美孕妇性xx| 欧美专区在线视频| 国产综合视频在线观看| 在线视频一区二区| 欧美三级欧美成人高清www| 亚洲第一区第一页| 高清一区二区三区日本久| 亚洲欧美日韩国产中文| 亚洲第一色在线| 91久久精品美女| 国产91色在线播放| 亚洲一二在线观看| 精品亚洲aⅴ在线观看| 欧美性少妇18aaaa视频| 亚洲国产成人久久| 日本高清+成人网在线观看| 国产精品久久久久久久久久小说| 国产欧美精品一区二区三区-老狼| 久久国产精品网站| 欧美国产视频一区二区| 中文字幕av一区中文字幕天堂| 日韩日本欧美亚洲| 不用播放器成人网| 日韩视频欧美视频| 91在线免费视频| 91久久精品国产91久久| 91亚洲精品一区二区| 亚洲一区二区三区久久| 日韩精品中文字幕在线观看| 国产精品久久久久9999| 国产精品国产三级国产专播精品人| 国产大片精品免费永久看nba| 98视频在线噜噜噜国产| 欧美激情精品久久久久久蜜臀| 亚洲成人1234| 日韩经典第一页| 亚洲欧美自拍一区| 亚洲欧美激情在线视频| 91亚洲精品视频| 亚洲女性裸体视频| 国产精品久久久久久久久久久久| 亚洲综合中文字幕在线观看| 国产精品69精品一区二区三区| 国产一级揄自揄精品视频| 国产91在线播放| 中文字幕一精品亚洲无线一区| 97国产精品视频人人做人人爱| 91色琪琪电影亚洲精品久久|