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{
progressBar1.Maximum = max;
progressBar1.Value = value;
});
}