想实现这样个进度条:主程序中执行一个任务时,弹出进度条窗体。注意,弹出窗口必须是模态对话框(ShowDialog)
主程序代码如下:
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);
}
}
}
}进度条窗体代码:
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
主程序代码如下:
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);
}
}
}
}进度条窗体代码:
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
解决方案 »
- 大家帮我看看这句话怎么错了
- C#: 已存于datatable的数据如何存盘成Visual Foxpro的DBF文件?(任何版本)
- 为什么"在位置 0 处没有任何行。"啊 很急啊 啊
- 求救,压缩Soap 改善Web Service性能的问题 急 ,加急
- C#中那个绘图函数是通过(字符串,颜色,字体...)作为参数
- 关于用SelectSingleNode进行搜索的问题
- 高分请教
- 想学C#,请各位高手给推荐几本好书。
- 我想画一条色彩渐变的线?大家能否告诉我一下思路?
- 请问:msdn中“This type supports the .NET Framework infrastructure and is not intended to be used directly from your code.”是什
- 短信猫接收不到短信的问题
- 音乐播放器怎么实现自动播放下一曲?
{
Control.CheckForIllegalCrossThreadCalls = false;//设置任何线程都可访问
}
void UpdateProcessBarValue(ProgressBar progressBar,int value)
{
if(progressBar.InvokeRequired)
{
UpdateProcessBarValueEventHandle d=new UpdateProcessBarValueEventHandle(UpdateProcessBarValue);
this.InVoke(d,new object{progressBar,value});
}
}
但在我的实际项目中,用线程会些问题。
刚才,想到了一种解决办法:在进度条窗体中使用Timer控件的timer1_Tick事件并声明委托事件,在主窗体中,注册委托事件 并 启动 timer1有效。
{
this.Invoke((EventHandler)delegate{
progressBar1.Maximum = max;
progressBar1.Value = value;
});
}
多谢各位的关注和解答。