1

我正在尝试在 petrel 中开发一个多线程插件,我的算法在 2 个单独的线程中运行。该插件似乎工作正常,除了我找不到任何更新进度条的方法。

使用 Invoke 不会更新进度条(c# 进度条),并且我的 UI 在执行期间完全冻结。

当算法运行时,有没有办法从另一个线程更新进度条(海燕进度条或标准进度条)?

谢谢

4

2 回答 2

4

Use Slb.Ocean.Petrel.PetrelLogger.NewAsyncProgress(String, ProgressType) or NewAsyncProgress(String, ProgressType, AsyncProgressCanceledCallback, Object) to update the progress bar from background threads.

于 2011-10-06T12:51:18.557 回答
2

Control.Invoke 仅在 UI 线程的消息处理未被阻塞时才有效。如果您的主线程正在等待结果,您需要定期调用 Application.DoEvents。

关于 Petrel 进度条:如果不允许用户交互,通常使用简单的进度条,Petrel 会被阻止,直到操作完成,而如果最终用户开始某些操作但他能够工作,则使用一个或多个异步进度条。操作在后台运行。

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

于 2011-10-12T13:50:33.423 回答