2009-03-03 68 views
1

我很快就要完成一項大學任務,而且我需要能夠調用需要很長時間(可能是infinte,它依賴於用戶輸入)才能執行的C++ dll。我通過VB調用它。當發生這種情況時,我的VB GUI凍結,我想讓GUI響應,以便用戶可以停止這個可能的無限循環。多線程的最佳方式

任何人都可以提出這樣做​​的最好/最快的方式?

有點背景,C++試圖使用網絡攝像頭在斯諾克桌上保持得分,而VB記分板很容易更新,我想編寫腳本以便分析幾乎是連續的,同時仍然允許用戶進行交互。目前該項目需要用戶按下一個按鈕來開始鏡頭分析,但如果程序自己編寫腳本,這將是更可取的。我現在才意識到這個問題,截止日期很快。

更新:我們的講師提出了一個解決問題的選項,但看起來這裏的大部分選項和他所建議的選項都不適合我們,因爲攝像頭圖像捕獲所需的處理時間太長,無法處理硬件限制。感謝您花時間幫助,非常感謝!

+1

聽起來像一個非常酷的項目。 – configurator 2009-03-05 16:53:31

回答

2

在VB.NET中處理線程的最好方法是通過System.Threading命名空間。

您也可能會考慮Application.DoEvents()

+0

儘管Application.DoEvent()與線程無關。 – erikkallen 2009-03-03 22:05:00

+0

我從來沒有說過:) – 2009-03-04 01:13:01

1

嘗試的System.Threading馬克說,也嘗試尋找這是在VB.NET簡單一點背景工作進程。 Readup here

0

就像替代方案一樣,你可以讓C++在後臺實際處理。當從VB中調用時,它只是從它檢索數據或發送一個命令(開始,退出,???),所有這些都將立即返回。

這也可以給你更多的可靠性,因爲C++不會錯過視頻幀,而VB收集垃圾或做菜或任何VB在後臺做的事情 - C++將讓你更接近實時系統。

RE:關於如何的評論。我可能會做的是讓我的VB程序向C++發送「消息」(正如我所說的)。消息只是一種思考函數/方法調用的方式 - 但通常它們會很快返回。

「開始」消息會告訴C++代碼啓動它的線程運行並返回。這是一個Linux C++ thread howto,我不知道你是否需要在Windows中做一些不同的事情(我不希望這樣做,但是我幾十年來沒有用C++作爲我的主要開發語言)。

如果不工作,只是谷歌「C++線程」

發送「停止」消息將停止該線程(可能免費資源)。

「獲取數據」調用將轉到C++線程用於存儲數據的位置,並抓取並返回。

對不起,如此普遍,我相當重的Java這些天。

1

我肯定會使用Background Worker進程。您可以將它拖到窗體上,並使用DoWork子例程來實際執行凍結GUI線程的工作。您還可以使用ReportProgress事件實際提供回到表單的進度。

至於你關於兩個單獨的線程的問題,如果兩個步驟需要很長時間才能完成,我會一個接一個地在同一個線程中運行它們。

使用該線程可能會引起你的一件事是線程交叉。在你的問題的情況下,這意味着沒有你的第二個線程更新表單控件。

如何在處理交叉線程時實現此代碼的一個非常好的資源是PDF

我還應該指出,如果你使用的是.net 1.0/1.1,你仍然可以做多線程,但是沒有後臺工作者控制的精神。你只需要從System.Threading命名空間創建一個新的線程。