2012-01-02 71 views
0

目前,我打電話的DoEvents,以檢查是否按鈕富表格酒吧已被點擊。這種方法可行,但它需要太多的處理能力,延遲了程序。不使用DoEvents,如何檢測按鈕是否被按下?

我相信,如果我只能檢查按鈕富已被點擊,而不是所有其他形式的的DoEvents要經過的延遲可能會減少。

關於如何檢查是否有任何想法Button Foo被點擊?

+3

按鈕會生成一個事件,您可以爲該事件編寫處理程序。如果您使用的是DoEvents,您可能會從閱讀有關VB6事件處理的更多好處(提示:DoEvents不是一個好方法)。 – jdigital 2012-01-02 20:42:30

+0

你可能會嘗試的一件事情可能會顯着提高你的表現,只有每100次循環或某個這樣的數字纔會發生DoEvents。這將允許您的程序處理UI交互並提高您的性能。 – UnhandledExcepSean 2012-01-02 23:25:05

+2

請首先解釋爲什麼使用按鈕的事件處理程序不起作用。如果我們更瞭解您的代碼結構,我們可能會提出另一種不會遇到同樣問題的風格。 – tcarvin 2012-01-04 12:49:17

回答

6

VB6並不是真正爲你看起來正在做的事情設計的(某種長時間運行的直線代碼不會退出以提供消息循環控制)。通常這樣的任務將被委託給工作者線程,並且在VB6中這意味着大部分時間在C++中實現一些外部組件。

目前只有極少數種辦法採取爲您特設邏輯做到這一點:

  • 黑客通過API調用創建單獨的線程,在VB6不是很可靠的許多原因。
  • 一個棘手的每對象線程ActiveX EXE實現一個類來處理你長時間運行的工作負載。
  • 一個獨立的非交互式工作人員進程將由您的GUI程序運行和監視。

就是這樣。

執行此類事情的規定方法在VB6文檔中描述。您打破了長期運行的循環,並將邏輯轉化爲可重複的「量子」工作(如處理循環的n次迭代),並在Form-Global數據中維護工作負載的狀態。然後使用定時器控件,其間隔設置爲1或16(幾乎不重要,通常至少需要16ms才能觸發),並在您的事件處理程序中運行您的工作負載量程。

所以,如果你只是有一個循環,目前迭代10萬次做一些事情,你可能會分解它,使它爲每個計時器滴答運行500次。量子大小可能需要根據循環內完成的事情進行調整 - 500只是一個選擇用於說明的值。你需要調整它直到它離開UI的響應,而不會讓你的後臺工作量過多(減慢完成速度)。

1

如果您的代碼足夠大以至於不能撥打DoEvents或者只是定期完成運行,那麼您的應用程序甚至不會知道該按鈕已被按下。呼叫DoEvents允許窗口和您的應用程序趕上所有通知。

解決此問題的正確方法是工作線程(請參閱this article瞭解如何在VB6中執行此操作),但如果未能完成此操作,則需要定期執行DoEvents,從而導致某些重入阻止進入長期運行的代碼。