Timer

Timer

Timer,定時器,功能是在指定的時間間隔內反覆觸發指定視窗的定時器事件 。

語法

()

語法Timer ( interval {, windowname } )

參數

指定兩次觸發Timer事件之間的時間間隔,有效值在0到65之間。如果該參數的值指定為0,那么關閉定時器,不再觸發指定視窗的Timer事件。windowname:視窗名,指定時間間隔到時要觸發哪個視窗的Timer事件。省略該參數時,觸發當前視窗的Timer事件返回值Integer。函式執行成功時返回1,發生錯誤時返回-1。如果任何參數的值為NULL,Timer()函式返回NULL。用法使用Timer()函式可以周期性地觸發指定視窗的Timer事件,這樣,每當時間間隔過去時,應用程式都可以完成一些周期性的工作,比如繪製簡單動畫等。將Timer()的interval參數設定為非0值時啟動定時器並開始計時;將該函式的interval參數設定為0時關閉定時器,終止計時任務。需要注意的是,在Microsoft Windows系統中,該函式能夠計時的最小時間間隔為0.055秒(約1/18秒),如果把interval參數的值設定小於0.055,那么該定時器將每隔0.055秒觸發一次視窗的Timer事件。Microsoft Windows 3.x最多只支持系統中同時啟動16個定時器。

種類

1、 接通延時型定時器:接通延時型定時器是各種PLC中最常見最基本的定時器,這種定時器在 SIEMENS的PLC中,稱為SD型定時器

2、 斷開延時型定時器:這種定時器是當輸入條件00000為ON時無延時作用,只有在輸入條件00000為OFF時產生延時作用。在SIEMENS的PLC中,稱為SF型定時器

3、保持型接通延時定時器:這種定時器是當輸入條件00000為ON後,即產生鎖存功能,即使輸入條件00000又變為OFF,仍視輸入條件為ON,當定時器的當前值等於設定值時,定時器動作,這種定時器在SIEMENS的PLC中,稱為SS型定時器   4、脈衝型定時器:這種定時器是當輸入條件00000為ON後,定時器即時動作,但經過定時器所設定的時間後,即使輸入條件00000仍為ON,定時器卻變為OFF狀態。即這種定時器ON狀態的維持時間是由設定值決定的。如果00000為ON的時續時間小於定時器的設定值,定時器的ON狀態維持時間為輸入條件00000為ON的持續時間。這種定時器在SIEMENS的PLC中,稱為SP型定時器。   5、擴張型脈衝定時器:這種定時器與脈衝型定時器的區別是,只要輸入條件00000齣現了ON狀態,不管其持續時間多長,均可使定時器為ON的維持的時間與定時器的設定值一致。這種定時器在SIEMENS的PLC中,稱為SE型定時器。

用法

我們可以使用MFC的CWnd類提供的成員函式SetTimer實現定時器功能,下面分步驟講解MFC定時器的用法。

1、啟動定時器。

啟動定時器就需要使用CWnd類的成員函式SetTimer。CWnd::SetTimer的原型如下:

參數nIDEvent指定一個非零的定時器ID;參數nElapse指定間隔時間,單位為毫秒;參數lpfnTimer指定一個回調函式的地址,如果該參數為NULL,則WM_TIMER訊息被傳送到應用程式的訊息佇列,並被CWnd對象處理。如果此函式成功則返回一個新的定時器的ID,我們可以使用此ID通過KillTimer成員函式來銷毀該定時器,如果函式失敗則返回0。

通過SetTimer成員函式我們可以看出,處理定時事件可以有兩種方式,一種是通過WM_TIMER訊息的訊息回響函式,一種是通過回調函式。

如果要啟動多個定時器就多次調用SetTimer成員函式。另外,在不同的CWnd中可以有ID相同的定時器,並不衝突。

2、為WM_TIMER訊息添加訊息處理函式,或者定義回調函式。

如果調用CWnd::SetTimer函式時最後一個參數為NULL,則通過WM_TIMER的訊息處理函式來處理定時事件。添加WM_TIMER訊息的處理函式的方法是,在VS2010工程的Class View類視圖中找到要添加定時器的類,點擊右鍵,選擇Properties,顯示其屬性頁,然後在屬性頁工具列上點擊Messages按鈕,下面列表就列出了所有訊息,找到WM_TIMER訊息,添加訊息處理函式。添加後,cpp檔案中會出現類似如下內容:

BEGIN_MESSAGE_MAP(CExample44Dlg, CDialogEx)

......

ON_WM_TIMER()

END_MESSAGE_MAP()

void CExample44Dlg::OnTimer(UINT_PTR nIDEvent)

{

// TODO: Add your message handler code here and/or call default

CDialogEx::OnTimer(nIDEvent);

}

之後就可以在OnTimer函式中進行相應的處理了。OnTimer的參數nIDEvent為定時器ID,即在SetTimer成員函式中指定的定時器ID,如果有多個定時器,我們可以像下面這樣處理:

void CExample44Dlg::OnTimer(UINT_PTR nIDEvent)

{

// TODO: Add your message handler code here and/or call default

switch (nIDEvent)

{

case 1:

// 如果收到ID為1的定時器的訊息則調用func1函式

func1();

break;

case 2:

// 如果收到ID為2的定時器的訊息則調用func2函式

fun2();

break;

......

default:

break;

}

CDialogEx::OnTimer(nIDEvent);

}

如果調用CWnd::SetTimer函式時最後一個參數不為NULL,則需要定義回調函式。回調函式的形式如下:

void CALLBACK EXPORT TimerProc(

HWND hWnd, // handle of CWnd that called SetTimer

UINT nMsg, // WM_TIMER

UINT nIDEvent // timer identification

DWORD dwTime // system time

);

參數hWnd為調用SetTimer成員函式的CWnd對象的句柄,即擁有此定時器的視窗的句柄;參數nMsg為WM_TIMER,而且總是為WM_TIMER;參數nIDEvent為定時器ID;參數dwTime為系統啟動以來的毫秒數,即GetTickCount函式的返回值。

這樣CWnd::SetTimer函式最後一個參數就可以為TimerProc。

這裡注意下,回調函式的名稱不一定為TimerProc,可以取其他名字,但返回值類型、參數的類型和個數不能改變。

下面給出一個回調函式的例子:

void CALLBACK EXPORT TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)

{

switch(nTimerid)

{

case 1:

// 處理ID為1的定時器的事件

func1();

break;

case 2:

// 處理ID為2的定時器的事件

func2();

break;

......

default:

break;

}

}

回調函式為全局函式,需要寫在使用它的位置的前面,或者寫在後面然後在使用之前聲明。

3、銷毀定時器。

不再使用定時器時,可以銷毀它。銷毀定時器需使用CWnd類的KillTimer成員函式,CWnd::KillTimer函式的原型如下:

BOOL KillTimer(UINT_PTR nIDEvent);

參數nIDEvent為要銷毀的定時器的ID,是調用CWnd::SetTimer函式時設定的定時器ID。如果定時器被銷毀則返回TRUE,而如果沒有找到指定的定時器則返回FALSE。

如果要銷毀多個定時器,則多次調用KillTimer函式並分別傳入要銷毀的定時器的ID。

相關詞條

相關搜尋

熱門詞條

聯絡我們