2012-02-24 47 views
0

我有一個窗體上有幾個按鈕,當用戶按下其中一個按鈕時,它開始一個漫長的過程(需要幾秒鐘)。我想要發生的是任何後續按鈕發生在窗體上的任何其他按鈕都會被忽略,直到該過程從初始按鈕按下完成。實際發生的情況是,隨後的按鈕按下進入隊列,並按順序執行每個完成的進程。我的意思是,如果每個按鈕執行一個需要2秒鐘的功能,並且我非常快速地按下5個按鈕(在不到2秒的時間內),它會導致一系列事件需要10秒鐘......我想要發生的事情是因爲它導致只有FIRST按鈕發生,並且採取它被激活的2秒鐘的功能。當在VB.net中忙時禁止事件處理

我正在寫軟件,通過USB到UART轉換器與硬件接口,我正在使用虛擬COM端口,並且時序非常關鍵。我希望在按下按鈕時發生某些事情,而不是等待上一次操作完成後幾秒鐘後才發生。

回答

1

更困難,但成果豐碩,方法是移動繁忙的工作開了個BackgroundWorker線程。您仍然需要管理表單上的控件,以限制用戶在處理先前的請求時可以執行的操作,但也可以讓您的表單在完成手頭任務的同時重新繪製和處理其他事件。

+0

我會試一試,我之前使用過後臺工作者類,謝謝 – CHollman82 2012-02-24 20:05:41

+0

這給了我一直在尋找的行爲,謝謝。 – CHollman82 2012-02-24 20:31:50

0

請考慮簡單地在長時間運行的動作開始時禁用所有按鈕,並在完成時重新啓用它們。

+0

我試過了,它會導致視覺上的「毛刺」。當你禁用一個按鈕時,它會灰顯,所以當我禁用並且很快重新啓用二十個按鈕時,它看起來......「錯誤」。但是,感謝您的選擇,我會認爲這是最後的手段 – CHollman82 2012-02-24 19:59:11

+0

如果將按鈕放在面板上然後禁用面板會發生什麼?按鈕是否仍然被禁用?另外,我忘記了細節,但在禁用所有按鈕時沒有辦法抑制繪圖,然後讓它們全部重新禁用? – 2012-02-24 20:01:01

0

有幾種方法可以做到這一點。最簡單的可能是你的窗體的Enabled屬性被點擊第一個按鈕時,後面設置爲false,那麼真該過程何時完成:

Try 
    this.Enabled = False; 
    ... do your work 
Finally 
    this.Enabled = True; 
End Try 
+0

儘管這看起來很糟糕,甚至使用了suspendlayout和resumelayout(它看起來不像我期望的那樣工作......) – CHollman82 2012-02-24 20:11:10

0

我sugget爲您在.NET中使用隊列..

在每次按下添加特定的命令或枚舉到隊列按鈕..

,並完成後,每一道工序出隊的命令,並檢查隊列中,如果你有更多的命令或操作待辦事項。

這不會讓用戶禁用按鈕並重新啓用它們。

我希望這將有助於

+0

看起來像一個很好的選擇,但直到前一個事件纔得到事件完成...起初,我嘗試使用布爾標誌來表示該應用程序很忙,並且我在每個事件上測試了這個標誌,並對它進行了適當的設置和清除,但是我發現我從來沒有爲繁忙測試過。我相信這是因爲事件處理程序本身在上一個長操作完成之前不會被調用。事件排隊發生在幕後,我無法訪問ot – CHollman82 2012-02-24 20:14:31