在PIESDK开发中添加进度条
我们在进行窗体设计时会遇到一个问题,就是如何显示当前窗体算法的进度如何反馈给用户呢
①是通过在每个窗体中都加一个进度条
②是在主窗体中设计一个进度条供窗体执行的算法更新其进度。
方法①通过百度即可查询出许多的示例,我这里就主要介绍方法②
首先我们在主窗体添加一个进度条progressBar并在其旁边添加一个Label
或者在状态栏ToolStrip中添加ToolStripProgressBar并在其旁边添加ToolStripLabel
记得要将Modifiers属性改为Public,否则别的窗体无法找到此控件

在调用PIESDK中的算法时我们需要用到异步调用(AlgoFactory.Instance().AsynExecuteAlgo(algo))才有进度更新事件(ISystemAlgoEvents.OnProgressChanged)
这时我们需要运用到跨线程调用windows窗体控件,官方的帮助文档如下
https://docs.microsoft.com/zh-cn/dotnet/desktop/winforms/controls/how-to-make-thread-safe-calls-to-windows-forms-controls?view=netframeworkdesktop-4.8
如官方文档所说:它查询System.Windows.Forms.Control.InvokeRequired属性,该属性将控件的创建线程ID与调用线程ID进行比较。如果线程ID相同,则直接调用控件。如果线程ID不同,它将使用主线程的委托来调用Control.Invoke方法,从而对控件进行实际调用。
那么我们在更新其值之前需要先对Label和progressBar进行线程的判断,并通过Control.Invoke对其进行调用。
private delegate void setValue(int value, string text = "");//委托
public void Update(int value, string text = "")//更新方法
{
if (this.myLabel.InvokeRequired)//判断是否为主线程
{
var mydelegate = new setValue(Update);//使用主线程的setValue委托
this.myLabel.Invoke(mydelegate, value, text);//委托之后将会进入else内
}
else
{
this.myLabel.Text = text;//更新百分比
this.myProgressBar.Value = value;//更新进度
}
}
同时在ISystemAlgoEvents.OnProgressChanged函数中加入以下代码
int value = (int)complete;
pie1.Update(value, value.ToString() + "%");//pie1为主窗体名
return 0;
那么这样就可以对跨线程对主窗体的控件进行安全的调用啦~~

安全地对跨线程调用windows窗体控件。
浙公网安备 33010602011771号