以前第一次看到apc,也就是非同步過程呼叫的時候,沒有搞明白這是乙個什麼樣的機制。
今天再看一次,然後結合一些簡單的測試**和搜尋來的資料,大概明白了是怎麼回事。
先來非常簡單地描述一下這乙個「可等待的計時核心物件」。
大概定義如下:
可等待的計時器物件是這樣一種核心物件,它們會在某個指定的時間觸發,或每一段時間觸發一次,它們通常用來在某個時間執行一些操作。
建立乙個可等待的計時器:createwaitabletimer
得到乙個已經存在的可等待的計時器的控制代碼:openwaitabletimer
設定可等待的計時器:setwaitabletimer
可等待的計時器新增apc呼叫
miscrosoft允許計時器把乙個非同步過程呼叫(asynchronnous procedure call,apc)放到呼叫執行緒的佇列中。將這乙個非同步過程呼叫放到呼叫執行緒的佇列中,是通過呼叫setwaitabletimer並利用型別為ptimerapcroutine的乙個引數,這個引數其實是乙個函式指標型別,所以非同步過程的位址就是傳到這裡。想要執行緒呼叫這些非同步過程,執行緒還必須處於可提醒狀態,也就是通過呼叫sleepex,waitforsingleobjectex,waitformultipleobjectex,msgwaitformultipleobjectex而進入的等待狀態。這些函式都有乙個引數,指是執行緒是否進入可提醒狀態。
示例**:
#define _win32_winnt 0x0400
#include#include//這裡面只包含一些巨集,不包括一些型別定義
#include#includevoid apientry timerapcroutine(pvoid pvargtocompletionroutine,
dword dwtimerlowvalue,dword dwtimerhighvalue) ;
int main(void)
void apientry timerapcroutine(pvoid pvargtocompletionroutine,
dword dwtimerlowvalue,dword dwtimerhighvalue)
程式大概的執行流程就是:建立乙個可等待的計時器並新增乙個非同步過程呼叫,隨之呼叫sleepex進入可提醒狀態。當計時器觸發時,呼叫setwaitabletimer的執行緒就會呼叫apc佇列中的一項,也就是我們剛才傳入
的函式位址。執行完畢後,執行緒隨即從sleepex呼叫中返回。大概流程就是這樣。
ps:如果呼叫sleepex時,apc佇列不為空,則執行緒不會睡眠,而是呼叫apc佇列中的一項,直到apc隊列為空。當呼叫那些讓執行緒睡眠的函式時,當且僅當執行緒的apc佇列中一項都沒有的時候,這些函式才會將執行緒掛起。
還值得一提的是,這乙個讓可等待的計時器新增apc呼叫的機制,有點類似linux下的處理alarm訊號的訊號處理函式。
可等待計時器
該核心物件類似於計時器。當然,它和使用者模式下的計時器是有區別的。使用createwaitabletimer函式可以建立乙個可等待計時器核心物件。用setwaitabletimer函式來對可等待計時器核心物件進行設定。另外可等待計時器核心物件還可以以非同步 asynchronous 方式呼叫函式 a...
伺服器計時器與 Windows 計時器
說明 此文大部分內容摘自msdn,本人只是做了一點整理。如果有什麼異議,一切以msdn為準。一 引言 在 visual studio net 中有兩種計時器控制項 基於伺服器的計時器和標準的基於 windows 的計時器。基於 windows 的計時器為在 windows 窗體應用程式中使用而進行了...
Python實列 計時器呼叫
1.fout.py python中對於計時器的呼叫.顯示.from dummy threading import class fout this class contain some functions to display.defualt string wait.system is waiting...