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的原型如下:
UINT_PTR SetTimer(    UINT_PTR nIDEvent,    UINT nElapse,    void (CALLBACK* lpfnTimer)(        HWND,        UINT,        UINT_PTR,        DWORD    ));
參數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。

相關詞條

熱門詞條

聯絡我們