winFrom进度条问题
想实现这样个进度条:主程序中执行一个任务时,弹出进度条窗体。注意,弹出窗口必须是模态对话框(ShowDialog)
主程序代码如下:
C# code
namespace ProcessBar
{
public partial class Form1 : Form
{
private delegate void ShowProcessBarFrm(int max, int value);
private frmProcessBar myProgbar;
public Form1()
{
InitializeComponent();
myProgbar = new frmProcessBar();
}
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(UpdateProgressBar));
thread.Start();
if (myProgbar != null)
{
lock (myProgbar.ProgressBar)
{
myProgbar.ShowDialog();
}
}
}
private void UpdateProgressBar()
{
ShowProcessBarFrm p = new ShowProcessBarFrm(myProgbar.SetProgess);
int initialValue = 100;
for (int count = 0; count < initialValue; count = count + 2)
{
//myProgbar.SetProgess(initialValue, count);
p.Invoke(initialValue, count);
}
}
}
}
进度条窗体代码:
C# code
public void SetProgess(int max, int value)
{
if (value <= max)
{
if (InvokeRequired)
{
progressBar1.Maximum = max;
progressBar1.Value = value;
if (value == max)
{
progressBar1.Visible = false;
}
else
{
progressBar1.Visible = true;
}
}
}
}
程序运行出现问题:"System.InvalidOperationException: 线程间操作无效: 从不是创建控件“progressBar1”的线程访问它。
恳求,各位大侠指点。如何解决。之前使用弹出非模态窗体(Show)时已经实现,要求该为模态框就有问题了。
大家有什么好的方法请多提宝贵意见。
也阅读过来一些多线程实现的方法如:http://www.cnblogs.com/tannaiyin/archive/2009/04/26/1444164.html
------解决方案--------------------private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;//设置任何线程都可访问
}
------解决方案--------------------用backgroundworker试试
------解决方案--------------------线程中不要访问界面上的东西,用委托去做
------解决方案--------------------Control.Invoke()
------解决方案--------------------delegate void UpdateProcessBarValueEventHandle(ProgressBar progressBar,int value);
void UpdateProcessBarValue(ProgressBar progressBar,int value)
{
if(progressBar.InvokeRequired)
{
UpdateProcessBarValueEventHandle d=new UpdateProcessBarValueEventHandle(UpdateProcessBarValue);
this.InVoke(d,new object{progressBar,value});
}
}
------解决方案--------------------
------解决方案--------------------用委托做
------解决方案--------------------if (InvokeRequired)
{
this.Invoke((EventHandler)delegate{