1. 程式人生 > >關於SetTimer間隔小於OmTimer執行時間的問題

關於SetTimer間隔小於OmTimer執行時間的問題

所有 pic 調用 das http str box trace modal

如果SetTimer的時間間隔為t,其響應事件OnTimer代碼執行一遍的時間為T,且T>t。
這樣,一次未執行完畢,下一次定時到,這時候程序會如何執行?

可能的情況:
1、丟棄還未執行的代碼,開始新的執行;
2、不丟棄,Timer消息進入消息隊列排隊,等到原來的代碼執行完畢後,馬上開始新的執行;
3、重入,就是原來的還繼續執行,同時又開始一個新的執行;

答案:第二個,或者,第一個丟棄。不過丟棄的情況是, 消息隊列滿了, 第二次的消息沒進去。

void COnTimer1Dlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default

CString str = "";
str.Format(" %d",i);
for(int k = 0;k<100;k++)
{
TRACE(str);
}
i++;
CDialog::OnTimer(nIDEvent);
}

不是的,你可以這樣想,每一個窗口有一個消息隊列,收到的消息就存在這裏

然後winmain中的那個getmessage循環從隊列中取得消息,然後dispatchmessage(其實,

可以認為她就是以消息為參數,調用窗口過程。)然後在去取下一個消息。

所以,第二個wm——timer來了,也只能在隊列裏面呆著, 等它前面的所有消息

都被處理完畢才會被處理。



另外,wm——timer消息有一個特點,只要消息隊列中還有wm——timer(同一個定時器),
那麽這個wm——timer就會被丟棄。也就是說,消息隊列中最多只有一個wm——timer
(同一個定時器)

DoModal和MessageBox的自身代碼裏面有消息循環(負責消息取出和處理),當一個MessageBox還存在的時候,CPU還在處理MessageBox內部的代碼,當你有任何消息的時候到來,MessageBox內部的代碼會負責將之處理掉。

你要是不明白我給你講!這裏只有一個線程,當然只有一個消息循環,只是當你彈出對話框的時候,對話框阻塞了主線程的消息循環,而接替過來了消息循環,因為它的內部也是一個無限的消息接收,派發機制。而你再彈出另一個對話框b的時候,對話框b又會接替過來消息循環,而把第一個對話框阻塞掉。這也是你為什麽彈出第2個對話框後第一個對話框變得點擊無效了的原因。

http://bbs.csdn.net/topics/110151804

http://bbs.csdn.net/topics/370257632

關於SetTimer間隔小於OmTimer執行時間的問題