日期:2014-05-18  浏览次数:21004 次

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});
}
}


------解决方案--------------------
探讨
delegate void UpdateProcessBarValueEventHandle(ProgressBar progressBar,int value);
void UpdateProcessBarValue(ProgressBar progressBar,int value)
{
if(progressBar.InvokeRequired)
{
UpdateProcessBa……

------解决方案--------------------
用委托做

------解决方案--------------------
if (InvokeRequired)
{
this.Invoke((EventHandler)delegate{