C函數篇(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個定時器。ide

種類

一、 接通延時型定時器:接通延時型定時器是各類PLC中最多見最基本的定時器,這種定時器在 SIEMENS的PLC中,稱爲SD型定時器
二、 斷開延時型定時器:這種定時器是當輸入條件00000爲ON時無延時做用,只有在輸入條件00000爲OFF時產生延時做用。在SIEMENS的PLC中,稱爲SF型定時器
三、保持型接通延時定時器:這種定時器是當輸入條件00000爲ON後,即產生鎖存功能,即便輸入條件00000又 變爲OFF,仍視輸入條件爲ON,當定時器的當前值等於設定值時,定時器動做,這種定時器在SIEMENS的PLC中,稱爲SS型定時器   四、脈衝型定時器:這種定時器是當輸入條件00000爲ON後,定時器即時動做,但通過定時器所設定的時間後,即便輸入條件00000仍爲ON,定時器卻 變爲OFF狀態。即這種定時器ON狀態的維持時間是由設定值決定的。若是00000爲ON的時續時間小於定時器的設定值,定時器的ON狀態維持時間爲輸入 條件00000爲ON的持續時間。這種定時器在SIEMENS的PLC中,稱爲SP型定時器。   五、擴張型脈衝定時器:這種定時器與脈衝型定時器的區別是,只要輸入條件00000出現了ON狀態,無論其持續時間多長,都可使定時器爲ON的維持的時間 與定時器的設定值一致。這種定時器在SIEMENS的PLC中,稱爲SE型定時器。

用法

咱們可使用MFC的CWnd類提供的成員函數SetTimer實現定時器功能,下面分步驟講解MFC定時器的用法。
一、啓動定時器。
啓動定時器就須要使用CWnd類的成員函數SetTimer。CWnd::SetTimer的原型以下:
 1 UINT_PTR SetTimer(
 2     UINT_PTR nIDEvent,
 3     UINT nElapse,
 4     void (CALLBACK* lpfnTimer)(
 5         HWND,
 6         UINT,
 7         UINT_PTR,
 8         DWORD
 9     )
10 );
參數nIDEvent指定一個非零的定時器ID;參數nElapse指定間隔時間,單位爲毫秒;參數 lpfnTimer指定一個回調函數的地址,若是該參數爲NULL,則WM_TIMER消息被髮送到應用程序的消息隊列,並被CWnd對象處理。若是此函 數成功則返回一個新的定時器的ID,咱們可使用此ID經過KillTimer成員函數來銷燬該定時器,若是函數失敗則返回0。
經過SetTimer成員函數咱們能夠看出,處理定時事件能夠有兩種方式,一種是經過WM_TIMER消息的消息響應函數,一種是經過回調函數。
若是要啓動多個定時器就屢次調用SetTimer成員函數。另外,在不一樣的CWnd中能夠有ID相同的定時器,並不衝突。
二、爲WM_TIMER消息添加消息處理函數,或者定義回調函數。
若是調用CWnd::SetTimer函數時最後一個參數爲NULL,則經過WM_TIMER的消息處理函數來處理 定時事件。添加WM_TIMER消息的處理函數的方法是,在VS2010工程的Class View類視圖中找到要添加定時器的類,點擊右鍵,選擇Properties,顯示其屬性頁,而後在屬性頁工具欄上點擊Messages按鈕,下面列表就 列出了全部消息,找到WM_TIMER消息,添加消息處理函數。添加後,cpp文件中會出現相似以下內容:
1 BEGIN_MESSAGE_MAP(CExample44Dlg, CDialogEx)
2 ......
3 ON_WM_TIMER()
4 END_MESSAGE_MAP()
5 void CExample44Dlg::OnTimer(UINT_PTR nIDEvent)
6 {
7 // TODO: Add your message handler code here and/or call default
8 CDialogEx::OnTimer(nIDEvent);
9 }
以後就能夠在OnTimer函數中進行相應的處理了。OnTimer的參數nIDEvent爲定時器ID,即在SetTimer成員函數中指定的定時器ID,若是有多個定時器,咱們能夠像下面這樣處理:
 1 void CExample44Dlg::OnTimer(UINT_PTR nIDEvent)
 2 {
 3 // TODO: Add your message handler code here and/or call default
 4 switch (nIDEvent)
 5 {
 6 case 1:
 7 // 若是收到ID爲1的定時器的消息則調用func1函數
 8 func1();
 9 break;
10 case 2:
11 // 若是收到ID爲2的定時器的消息則調用func2函數
12 fun2();
13 break;
14 ......
15 default:
16 break;
17 }
18 CDialogEx::OnTimer(nIDEvent);
19 }
若是調用CWnd::SetTimer函數時最後一個參數不爲NULL,則須要定義回調函數。回調函數的形式以下:
1 void CALLBACK EXPORT TimerProc(
2 HWND hWnd, // handle of CWnd that called SetTimer
3 UINT nMsg, // WM_TIMER
4 UINT nIDEvent // timer identification
5 DWORD dwTime // system time
6 );
參數hWnd爲調用SetTimer成員函數的CWnd對象的句柄,即擁有此定時器的窗口的句柄;參數nMsg爲 WM_TIMER,並且老是爲WM_TIMER;參數nIDEvent爲定時器ID;參數dwTime爲系統啓動以來的毫秒數,即 GetTickCount函數的返回值。
這樣CWnd::SetTimer函數最後一個參數就能夠爲TimerProc。
這裏注意下,回調函數的名稱不必定爲TimerProc,能夠取其餘名字,但返回值類型、參數的類型和個數不能改變。
下面給出一個回調函數的例子:
 1 void CALLBACK EXPORT TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)
 2 {
 3 switch(nTimerid)
 4 {
 5 case 1:
 6 // 處理ID爲1的定時器的事件
 7 func1();
 8 break;
 9 case 2:
10 // 處理ID爲2的定時器的事件
11 func2();
12 break;
13 ......
14 default:
15 break;
16 }
17 }
回調函數爲全局函數,須要寫在使用它的位置的前面,或者寫在後面而後在使用以前聲明。
三、銷燬定時器。
再也不使用定時器時,能夠銷燬它。銷燬定時器需使用CWnd類的KillTimer成員函數,CWnd::KillTimer函數的原型以下:
BOOL KillTimer(UINT_PTR nIDEvent);
參數nIDEvent爲要銷燬的定時器的ID,是調用CWnd::SetTimer函數時設置的定時器ID。若是定時器被銷燬則返回TRUE,而若是沒有找到指定的定時器則返回FALSE。
若是要銷燬多個定時器,則屢次調用KillTimer函數並分別傳入要銷燬的定時器的ID。
相關文章
相關標籤/搜索