2012-06-14 89 views
0

我有一箇舊的VB6應用程序有一個計時器問題。有一種模式形式包含一些元素和兩個定時器(VB6標準定時器)。每個定時器的工作原理是這樣的(僞代碼):VB6計時器問題

-- TimerEvent Start 
DoSomething 
DoEvents 
-- TimerEvent End 

然後,在某個時間點,從OCX控件的事件引發的一些連接丟失。與計時器本身無關。但是在這一點上,定時器事件不再對兩個定時器產生了,儘管 - 現在是奇怪的東西 - 定時器被啓用並且間隔爲2000。即使重新啓用和重新設置時間間隔也沒有任何影響。當來自同一OCX控件的另一個事件觸發連接恢復時,定時器事件再次突然升高。 即使刪除OCX控制事件處理程序中的所有代碼,定時器也不起作用。

我不是很熟悉DoEvents的「模式」,但我認爲這個問題必須與DoEvents相關。刪除這並沒有改變任何東西。

有沒有人知道這裏會發生什麼?我已經在尋找任何可以防止計時器提高已過去的事件的全局設置,但爲了上帝的緣故,我找不到任何設置。

我要瘋了...

謝謝你的幫助。

+2

我非常懷疑問題出在您引用的代碼中。相反,我懷疑OCX控件是用C/C++編寫的,並且直接與應用程序的消息泵混淆在一起,從而導致定時器崩潰。 – pmdj

+0

這確實是可能的。 DoEvents如何工作?它在被調用時處理隊列中的所有事件(以便不處理新事件)或直到隊列爲空?我手邊有OCX源代碼,並會檢查這一點。感謝提示。 – JensM

+1

這已經有一段時間了,但DoEvents基本上是用來在你長時間阻塞主線程時清空事件隊列。我不確定它的確切效果 - 我知道在某些情況下,連續多次調用DoEvents是必要的。其主要用途是在執行長時間運行的處理時不斷繪製UI並響應用戶輸入。我不確定爲什麼你會在事件處理程序的結尾處調用它,但我認爲它不會在那裏實際產生任何效果。 – pmdj

回答

0

對於遲到的回覆感到抱歉。

這是另一個計時器內部的計時問題。這另一個計時器ping 200ms的ping超時的另一個IP。這個定時器間隔是200ms。所以如果ping超時(因爲另一臺機器斷開連接),定時器的觸發頻率比它可以處理的頻率高。所以它搞亂了事件隊列並阻止所有其他定時器開火。 通過增加計時器間隔到1000ms它工作,雖然更好的解決方案是停止計時器,處理事件,然後重新啓動計時器。

感謝您的幫助提示!