我正在尝试在 petrel 中开发一个多线程插件,我的算法在 2 个单独的线程中运行。该插件似乎工作正常,除了我找不到任何更新进度条的方法。
使用 Invoke 不会更新进度条(c# 进度条),并且我的 UI 在执行期间完全冻结。
当算法运行时,有没有办法从另一个线程更新进度条(海燕进度条或标准进度条)?
谢谢
我正在尝试在 petrel 中开发一个多线程插件,我的算法在 2 个单独的线程中运行。该插件似乎工作正常,除了我找不到任何更新进度条的方法。
使用 Invoke 不会更新进度条(c# 进度条),并且我的 UI 在执行期间完全冻结。
当算法运行时,有没有办法从另一个线程更新进度条(海燕进度条或标准进度条)?
谢谢
Use Slb.Ocean.Petrel.PetrelLogger.NewAsyncProgress(String, ProgressType)
or NewAsyncProgress(String, ProgressType, AsyncProgressCanceledCallback, Object)
to update the progress bar from background threads.
Control.Invoke 仅在 UI 线程的消息处理未被阻塞时才有效。如果您的主线程正在等待结果,您需要定期调用 Application.DoEvents。
关于 Petrel 进度条:如果不允许用户交互,通常使用简单的进度条,Petrel 会被阻止,直到操作完成,而如果最终用户开始某些操作但他能够工作,则使用一个或多个异步进度条。操作在后台运行。
如果您选择第一种方法,您可以例如将进度存储在每个线程可见的变量中(确保变量被正确锁定),并且主线程可以定期在循环中读取该变量并相应地更新进度。