青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

etTimer函數用于創建一個計時器,KillTimer函數用于銷毀一個計時器。計時器屬于系統資源,使用完應及時銷毀。

 

  SetTimer的函數原型如下:
UINT_PTR SetTimer( HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc ) ;
  其中
  hWnd是和timer關聯的窗口句柄,此窗口必須為調用SetTimer的線程所有;如果hWnd為NULL,沒有窗口和timer相關聯并且nIDEvent參數被忽略
  nIDEvent是timer的標識,為非零值;如果hWnd為NULL則被忽略;如果hWnd非NULL而且與timer相關聯的窗口已經存在一個為此標識的timer,則此次SetTimer調用將用新的timer代替原來的timer。timer標識和窗口相關,兩個不同的窗口可以擁有nIDEvent相同的tiemr
  uElapse是以毫秒指定的計時間隔值,范圍為1毫秒到4,294,967,295毫秒(將近50天),這個值指示Windows每隔多久時間給程序發送WM_TIMER消息。
  lpTimerFunc是一個回調函數的指針,俗稱TimerFunc;如果lpTimerFunc為NULL,系統將向應用程序隊列發送WM_TIMER消息;如果lpTimerFunc指定了一個值,DefWindowProc將在處理WM_TIMER消息時調用這個lpTimerFunc所指向的回調函數,因此即使使用TimerProc代替處理WM_TIMER也需要向窗口分發消息。

  關于SetTimer的返回值:如果hWnd為NULL,返回值為新建立的timer的ID,如果hWnd非NULL,返回一個非0整數,如果SetTimer調用失敗則返回0

  KillTimer的函數原型為:BOOL KillTimer( HWND hWnd, UINT_PTR uIDEvent ) ; 參數意義同SetTimer。
  關于KillTimer對消息隊列中剩余未處理的WM_TIMER消息的影響,MSDN和Programming Windows上的說法完全相反。MSDN的說法很干脆:The KillTimer function does not remove WM_TIMER messages already posted to the message queue. 而petzold則說 The KillTimer call purges the message queue of any pending WM_TIMER messages. Your program will never receive a stray WM_TIMER message following a KillTimer call.(KillTimer消除消息隊列中任何未處理的WM_TIMER消息,調用KillTimer后你的程序永遠不會收到一條“漂泊游蕩”的WM_TIMER消息)

?

關于WM_TIMER消息

  wParam為計時器的ID;如果需要設定多個計時器,那么對每個計時器都使用不同的計時器ID。wParam的值將隨傳遞到窗口過程中的WM_TIMER消息的不同而不同。
  lParam為指向TimerProc的指針,如果調用SetTimer時沒有指定TimerProc(參數值為NULL),則lParam為0(即NULL)。
  可以通過在窗口過程中提供一個WM_TIMER case處理這個消息,或者,默認窗口過程會調用SetTimer中指定的TimerProc來處理WM_TIMER消息

使用計時器的三種方法

  如果在程序的整個執行過程中使用計時器,一般在處理WM_CREATE消息時或WinMain中消息循環前調用SetTimer,在處理WM_DESTROY消息時或在WinMain中消息循環后return前調用KillTimer。根據SetTimer中的參數不同,有三種方法使用計時器。

  方法一:調用SetTimer時指定窗口句柄hWnd,nIDEvent中指定計時器ID,將lpTimerFunc置NULL從而不使用TimerProc;在窗口過程中處理WM_TIMER消息調用KillTimer時,使用SetTimer中指定的hWnd和id。最好使用#define定義timer的id,例如:

#define ID_TIMER 1
SetTimer(hWnd,ID_TIMER,1000,NULL) ;
KillTimer(hWnd,ID_TIMER) ;

  方法二:調用SetTimer時指定窗口句柄hWnd,nIDEvent中指定計時器IDlpTimerFunc參數不為NULL而指定為TimerProc函數的指針。這種方法使用TimerProc函數(名字可自定)處理WM_TIMER消息

VOID CALLBACK TimerProc ( HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)
{
 //處理WM_TIMER訊息
}

   TimerProc的參數hwnd是在調用SetTimer時指定的窗口句柄。Windows只把WM_TIMER消息送給TimerProc,因此消息參數總是等于WM_TIMER。iTimerID值是計時器ID,dwTimer值是與從GetTickCount函數的返回值相容的值。這是自Windows啟動后所經過的毫秒數。 使用這種方法時,相關函數調用的形式為:

SetTimer(hWnd,ID_TIMER,1000,TimerProc) ;
KillTimer(hWnd,ID_TIMER) ;

  方法三:調用SetTimer時不指定窗口句柄(為NULL)iTimerID參數自然被忽略lpTimerFunc不為NULL而指定為TimerProc的指針。正如上面SetTimer的討論中所說的,此時SetTimer的返回值正是新建立的計時器的ID,需將這個ID保存以供KillTimer銷毀計時器時所用。當然,KillTimer的hWnd參數也置為NULL。這種方法同樣用TimerProc處理WM_TIMER消息

UINT_PTR iTimerID ;
iTimerID = SetTimer(NULL,0,1000,TimerProc) ;
KillTimer(NULL,iTimerID) ;

  使用這種方法的好處是不必自己指定計時器ID,這樣就不必擔心用錯ID。

使用多個計時器

  使用多個計時器只要在建立計時器時指定不同的ID。比如用上面所述方法一時的情況:

#define TIMER_SEC 1
#define TIMER_MIN 2

然后使用兩個SetTimer來設定兩個計時器:
SetTimer (hwnd, TIMER_SEC, 1000, NULL) ;
SetTimer (hwnd, TIMER_MIN, 60000, NULL) ;

WM_TIMER的處理如下所示:
case WM_TIMER:
 switch (wParam)
 {
  case TIMER_SEC:
   //每秒一次的處理
   break ;
  case TIMER_MIN:
   //每分鐘一次的處理
   break ;
 }
 return 0 ;

?

改變計時器的時間間隔

  如果想將一個已經存在的計時器設定為不同的時間間隔,可以簡單地用不同的時間值再次調用SetTimer。

計時器精確嗎?

  計時器并不精確。有兩個原因:

  原因一:Windows計時器是硬件和ROM BIOS架構下之計時器一種相對簡單的擴充。回到Windows以前的MS-DOS程序寫作環境下,應用程式能夠通過攔截者稱為timer tick的BIOS中斷來實現時鐘或計時器。一些為MS-DOS編寫的程序自己攔截這個硬件中斷以實現時鐘和計時器。這些中斷每54.915毫秒產生一次,或者大約每秒18.2次。這是原始的IBM PC的微處理器頻率值4.772720 MHz被218所除而得出的結果。在Windows 98中,計時器與其下的PC計時器一樣具有55毫秒的解析度。在Microsoft Windows NT中,計時器的解析度為10毫秒。Windows應用程式不能以高于這些解析度的頻率(在Windows 98下,每秒18.2次,在Windows NT下,每秒大約100次)接收WM_TIMER消息。在SetTimer中指定的時間間隔總是截尾后tick數的整數倍。例如,1000毫秒的間隔除以54.925毫秒,得到18.207個tick,截尾后是18個tick,它實際上是989毫秒。對每個小于55毫秒的間隔,每個tick都會產生一個WM_TIMER消息。
  可見,計時器并不能嚴格按照指定的時間間隔發送WM_TIMER消息,它總要相差那么幾毫秒。

  即使忽略這幾個毫秒的差別,計時器仍然不精確。請看原因二:
  WM_TIMER消息放在正常的消息隊列之中,和其他消息排列在一起,因此,如果在SetTimer中指定間隔為1000毫秒,那么不能保證程序每1000毫秒或者989毫秒就會收到一個WM_TIMER消息。如果其他程序的執行事件超過一秒,在此期間內,您的程式將收不到任何WM_TIMER訊息。事實上, Windows對WM_TIMER消息的處理非常類似于對WM_PAINT消息的處理,這兩個消息都是低優先級的,程序只有在消息隊列中沒有其他消息時才接收它們。
  WM_TIMER還在另一方面和WM_PAINT相似:Windows不能持續向消息隊列中放入多個WM_TIMER訊息,而是將多余的WM_TIMER消息組合成一個消息。因此,應用程序不會一次收到多個這樣的消息,盡管可能在短時間內得到兩個WM_TIMER消息。應用程序不能確定這種處理方式所導致的WM_TIMER消息「遺漏」的數目。
  可見,WM_TIMER消息并不能及時被應用程序所處理,WM_TIMER在消息隊列中的延誤可能就不能用毫秒來計算了。

  由以上兩點,你不能通過在處理WM_TIMER時一秒一秒計數的方法來計時。如果要實現一個時鐘程序,可以使用系統的時間函數如GetLocalTime ,而在時鐘程序中,計時器的作用是定時調用GetLocalTime獲得新的時間并刷新時鐘畫面,當然這個刷新的間隔要等于或小于1秒。

?

Posted on 2007-03-16 16:54 艾凡赫 閱讀(39600) 評論(3)  編輯 收藏 引用 所屬分類: MFC技術

Feedback

# re: SetTimer的使用問題   回復  更多評論   

2008-10-20 16:13 by 賈旭濱
"如果hWnd非NULL而且與timer相關聯的窗口已經存在一個為此標識的timer,則此次SetTimer調用將用新的timer代替原來的timer。"

你的文章之中有提到這句話,我想問的一個問題是,
新的Timer代替了舊的,那我們要先把舊的先Kill掉嗎(雖然他們的ID都是一樣的,但是Windows內部可能會重新產生一個新的Timer資源來供使用,我不能確定Windows是不是這樣的,所以詢問一下這個問題)?

補充一句:另外,重新設置一個一樣的timer,事件都開始重新計時了。
謝謝~~~

# re: SetTimer的使用問題   回復  更多評論   

2009-12-20 23:11 by 宇文黎琴
very good

# re: SetTimer的使用問題   回復  更多評論   

2012-07-17 17:01 by 林影
真好,所有的問題都解決了
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲字幕一区二区| 一区二区三区高清在线| 亚洲欧美视频一区| 午夜电影亚洲| 久久夜色精品国产亚洲aⅴ | 欧美在线亚洲综合一区| 亚洲精美视频| 亚洲国产高清一区| 国产欧美精品| 夜夜嗨av一区二区三区四区| 在线欧美影院| 老司机精品导航| 亚洲三级免费电影| 亚洲国产色一区| 久久深夜福利| 麻豆精品视频在线观看| 欧美高清视频在线观看| 国内精品美女av在线播放| 久久久久久一区二区三区| 亚洲综合首页| 日韩视频亚洲视频| 亚洲影视综合| 一本久久青青| 国内精品久久久久久| 美女啪啪无遮挡免费久久网站| 欧美日韩综合视频| 亚洲综合色丁香婷婷六月图片| 国产精品久久国产精麻豆99网站| 久久一二三四| 国产精品捆绑调教| 午夜欧美大片免费观看| 一区二区国产日产| 欧美福利精品| 久久男女视频| 欧美一区二区三区日韩| 亚洲国产欧美日韩| 禁断一区二区三区在线| 久久精品国产精品亚洲综合| 亚洲精品小视频| 亚洲第一综合天堂另类专| 一区二区三区免费观看| 国产精品成av人在线视午夜片| 欧美日韩视频一区二区| 久久精品视频免费| 国产精品v一区二区三区| 牛人盗摄一区二区三区视频| 久久国产精品99国产精| 亚洲精品一区二区三区婷婷月| 91久久黄色| 欧美视频免费在线观看| 欧美成人精品h版在线观看| 亚洲人成在线播放网站岛国| 亚洲电影视频在线| 久久精品视频va| 夜夜嗨av一区二区三区网页| 久久天天综合| 亚洲精品一级| 亚洲欧洲视频| 亚洲图片在区色| 欧美日韩国产精品自在自线| 亚洲精品日韩综合观看成人91| 一本高清dvd不卡在线观看| 欧美—级在线免费片| 欧美日韩另类字幕中文| 中文在线资源观看视频网站免费不卡| 久久国产精品久久久久久久久久| 免费日韩成人| 亚洲欧洲日产国产网站| 亚洲午夜在线视频| 亚洲国产欧美另类丝袜| 久久精品国产亚洲a| 性色一区二区| 亚洲欧美日韩一区在线| 亚洲国产婷婷香蕉久久久久久99| 国产精品一区二区黑丝| 欧美日韩中文字幕综合视频| 精品动漫3d一区二区三区免费| 亚洲欧美日韩精品久久奇米色影视| 韩国av一区二区三区四区| 国产情侣久久| 久热国产精品| 欧美日韩日日夜夜| 99精品视频免费观看视频| 国产一区二区三区四区在线观看 | 久久综合九色综合欧美就去吻| 亚洲电影免费在线观看| 亚洲电影免费观看高清完整版| 久久不射电影网| 激情久久一区| 欧美一区午夜视频在线观看| 久久精品1区| 欧美一级午夜免费电影| 国产精品亚洲综合| 国产亚洲一区二区三区在线观看 | 亚洲欧美另类国产| 亚洲人午夜精品| 久久久水蜜桃| 国产女精品视频网站免费 | 亚洲欧美制服另类日韩| 欧美国产精品v| 亚洲国产天堂久久国产91| 亚洲在线一区| 在线欧美三区| 欧美日韩国产区一| 亚洲欧美日韩另类| 国产精品地址| 亚洲色图在线视频| 久久亚洲精品一区二区| 亚洲激情视频在线| 国产精品jizz在线观看美国| 亚洲一区二区三区高清不卡| 久久久久久网| 国产精品视频网| 亚洲男人av电影| 国产精品亚洲精品| 欧美一级理论性理论a| 久久国产精品99精品国产| 久久亚洲免费| 亚洲国产婷婷香蕉久久久久久| 亚洲欧洲在线观看| 欧美日韩黄视频| 亚洲免费影视| 麻豆国产va免费精品高清在线| 亚洲区在线播放| 国产精品高潮在线| 欧美成人免费在线视频| 亚洲视频免费| 另类欧美日韩国产在线| 亚洲在线观看视频| 欧美日本在线观看| 国产亚洲成人一区| 亚洲欧美日韩一区二区在线| 国产一区二区三区电影在线观看 | 亚洲电影免费在线 | 99国产精品久久久| 亚洲精品五月天| 在线精品在线| 欧美成人免费网| 欧美在线国产| 日韩亚洲欧美一区二区三区| 国产精品久久久久久久久久免费| 欧美国产精品va在线观看| 99伊人成综合| 午夜国产精品影院在线观看| 亚洲伊人第一页| 久久免费精品日本久久中文字幕| 久久伊人免费视频| 久久野战av| 久久久.com| 国产精品一区二区久久| 欧美日本中文字幕| 国产精品久久久一区麻豆最新章节 | 亚洲第一中文字幕| 久久精品男女| 亚洲欧洲在线观看| 国产日韩精品一区二区| 国产区在线观看成人精品| 亚洲国产一区二区三区青草影视| 国产视频精品免费播放| 亚洲视频999| 亚洲电影在线观看| 午夜精品久久久久久久久久久久久 | 亚洲国产合集| 亚洲激情欧美| 亚洲一区二区视频| 在线观看福利一区| 亚洲天堂视频在线观看| 亚洲毛片在线观看| 久久精品国产免费观看| 美女爽到呻吟久久久久| 麻豆国产精品777777在线| 正在播放亚洲一区| 久久久亚洲成人| 亚洲国产精品专区久久| 亚洲欧美日韩精品综合在线观看| 欧美在线亚洲一区| 99精品福利视频| 欧美午夜理伦三级在线观看| 国产一区二区按摩在线观看| 六月天综合网| 欧美一区二区三区日韩| 国产人成精品一区二区三| 亚洲一区二区三区四区中文| 亚洲高清免费| 久久婷婷亚洲| 国产精品视频不卡| 亚洲欧洲中文日韩久久av乱码| 欧美国产第二页| 裸体一区二区| 亚洲人体大胆视频| 午夜在线a亚洲v天堂网2018| 在线午夜精品| 久久久精品免费视频| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美一区二区在线免费观看| 国产精品一区免费观看| 亚洲盗摄视频| 免费不卡视频| 欧美色区777第一页| 久久国产日本精品|