2011-10-06 82 views
1

我想在petrel中開發一個多線程插件,其中我的算法在兩個單獨的線程中運行。該插件似乎工作正常,但我無法找到任何方法來更新進度欄。從另一個線程更新petrel中的進度條

使用Invoke不會更新進度條(c#進度條),並且我的UI在執行期間完全凍結。

當算法運行時,是否有任何方法可以從另一個線程更新進度條(petrel progress或標準進度條)?

感謝

回答

4

使用Slb.Ocean.Petrel.PetrelLogger.NewAsyncProgress(String, ProgressType)NewAsyncProgress(String, ProgressType, AsyncProgressCanceledCallback, Object)更新從後臺線程的進度條。

+0

我是否需要在主線程或工作線程中聲明它?實際上,我有許多執行相同功能的線程,並且它們通過從ExecuteSimple()中產生線程池來同時運行。我是否需要將進度條作爲參數傳遞給線程? – user938972

2

Control.Invoke僅在UI線程的消息處理未被阻止時才起作用。如果您的主線程正在等待結果,您需要定期調用Application.DoEvents。

關於Petrel進度條:如果不允許用戶交互,通常會使用簡單的進度條,如果最終用戶開始某個操作,但可以使用一個或多個異步進度條,Petrel會被阻止直到操作完成在操作在後臺運行時工作。

如果您選擇第一種方法,您可以將進度存儲在每個線程都可見的變量中(確保該變量已正確鎖定),並且主線程可以定期在循環中讀取該變量並相應地更新進度。