2011-10-06 60 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会被阻止直到操作完成在操作在后台运行时工作。

如果您选择第一种方法,您可以将进度存储在每个线程都可见的变量中(确保该变量已正确锁定),并且主线程可以定期在循环中读取该变量并相应地更新进度。