時鐘事件執行時間超出時鐘週期問題解釋

點擊閱讀原文



時鐘組件 作爲定時器 系統會在設定時間發送 WM_TIMER 消息給消息隊列,因爲事件處理函數和窗口回調函數都是同線程, 在一個消息未處理完返回之前是不能處理其他事件消息的,也就是一個時鐘事件函數未執行完返回之前,系統是不會發送下一個 WM_TIMER 消息到消息隊列中的,所以第二個WM_TIMER消息也就是會被忽略掉。

將時鐘週期設置爲500

1.下面這個例子你會發現 a 和b是同步的數值是相等的就是這個道理

.局部變量 a, 整數型, 靜態
.局部變量 b, 整數型, 靜態

a = a + 1
調試輸出 (“a”, a)
延時 (1000)
b = b + 1
調試輸出 (“b”, b)


2.第二個例子很有意思,你會發現程序一直在輸出a ,而沒有輸出b,呵呵,你來猜猜是什麼原因?

.局部變量 a, 整數型, 靜態
.局部變量 b, 整數型, 靜態


a = a + 1
調試輸出 (“a”, a)
延遲 (1000)
b = b + 1
調試輸出 (“b”, b)

第二個例子 和第一個例子的區別是把延時()換成了延遲(),想來看看這兩個命令的作用和區別,他們的區別一個是相當於暫停當前線程向下執行,等待設定長時間後在向下執行,但並不處理事件消息;


另一個是在等待中並且處理事件消息。那麼爲什麼會出現這樣的結果呢,首先來看一下延遲()命令 他是在等待中處理消息隊列中未決的消息,那麼WM_TEMER也作爲一個消息隊列中的消息,所以延遲()

當然責無旁貸需要處理掉,那麼他是怎麼處理的呢,無非是需要用到 PeekMessage (lpMsg, 0, 0, 0,PM_REMOVE)   TranslateMessage (lpMsg)     DispatchMessage (lpMsg) 自然是會在消息從消息隊列中刪除掉,也就是給了程序一個假象,表示上一次WM_TIMER消息已經處理完可以接收下一個,延遲()命令執行了1000毫秒完畢以後 正常該繼續執行 b=b+1 並 調試輸出 () 結果 ,可延遲()還沒有執行完畢,因爲在他執行的過程當中新的WM_TIMER 又來了,這個時候程序會怎麼走呢?當延遲()命令還在執行當中,他會把進程未決的消息先依次處理,而在這期間收到的WM_TIMER都會被得到處理並執行,而每次延遲()命令會是這樣的遭遇,於是乎就有了這樣的結果,那麼會這樣一個問題,延遲()命令下面的代碼會不會被執行呢?答案是肯定的,可他永遠沒有機會被執行,除非延遲()命令成功執行完畢,可他永遠不會執行完畢。在一個因爲只壓棧不彈棧,執行一會程序就會出錯,棧溢出。。。。程序崩潰告終。

.版本 2
.支持庫 spec


.子程序 __啓動窗口_創建完畢


時鐘1.時鐘週期 = 1  ' 爲了加快這裏設置爲1


.子程序 _時鐘1_週期事件
.局部變量 a, 整數型, 靜態
.局部變量 b, 整數型, 靜態


a = a + 1
延遲 (5000)
b = b + 1
信息框 (a + b, 0, )


發佈了122 篇原創文章 · 獲贊 33 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章