我自己的一个进程要更改主窗体的proBar.Maximum。
这是原来的代码:
this.proBar.Maximum = this.selset.Count;   //编译无措,vs05下调试出错,进程间无法访问
我baidu过,说这种情况要使用委托。但本人太菜,试了半天也不行,大侠帮忙看看。
这种情况下委托应该怎么用呢?

解决方案 »

  1.   

    05下面不允许在非控件的创建线程操作控件实际有几种方法public void set()
    {
      proBar.Maximum = selset.Count;
    }void Form()
    {
      Thread t = new Thread(set);
      t.Start();
      t.Join();
    }
    //这样是不行的//方法1用委托set()方法不变,但这样就不能使用Theard,而是自动使用系统线程池
    delegate void setDeleagte();void Form()
    {
      setDeleagte setdl = new setDeleagte(set);
      this.BeginInvoke(setdl);  //这样就是在UI线程上调用了set方法,这个BeginInvoke需要以为委托参数
    }//方法2,修改set方法,就可以使用自己的Theard
    public void set()
    {
       //判断这个方法被调用是在创建控件线程还是非创建控件线程
       if (this.InvokeRequired)   
       {
          setDeleagte setdl = new setDeleagte(set);  
          this.BeginInvoke(setdl); 
       }
        else
           this.txtName.Text = "ssss"; 
    }
      

  2.   

    我告诉你一个最简单的方法
    在窗体构造函数里面加条语句: Form.CheckForIllegalCrossThreadCalls = false;你出错的原因是你的控件是主线程(main)生成的,而现在其他线程要使用它,05觉得不安全,就禁止你这样做 。加上这条语句后呢,相当于你在说:05你不用去检查线程之间的非法调用了,无论是哪个线程创建的控件,其他线程都可以用并修改
      

  3.   

    这样好象存在一定的风险吧...不能这样吧,如控件正被一个线程调用时,有另外一个线程也要进行操作,这个时候如果不判断控件的InvokeRequired 在05里面是会出现错误的吧
    学习……