[已解决问题] PictureBox控件线程中调用的疑问
提问时间: 2008-03-14 09:51
悬赏分:20 浏览:254 次

如果创建某控件的线程之外的其他线程试图调用该控件,则调试器会引发一个 InvalidOperationException,
并提示消息:“从不是创建控件 control name 的线程访问它。”
下面是部分代码
private void Form2_Load(object sender, EventArgs e)
{
            Form2.CheckForIllegalCrossThreadCalls = true;
            Thread t = new Thread(test);
            t.Start();
}
public void test()
{
      //Bitmap b = new Bitmap(@"c:\aaa.bmp");
      // this.pictureBox1.Image = b;

      this.textBox1.Text = "sss";
}
在方法test中设置textBox1的Text属性会报出"线程间操作无效: 从不是创建控件“textBox1”的线程访问它。"的错误
而给pictureBox1的Image属性赋值却没有这样的错误,为什么??请高手指点一二.


提问者:BZZ - 初学一级
所有回答(2)
原因:
C#不允许在一个线程中直接访问或操作另一线程中创建的控件
也就是不允许多个线程同时对一个对像进行修改.
解决方法:
用Delegate,按你上面写的代码应该改成:

private void Form2_Load(object sender, EventArgs e)
{
            Form2.CheckForIllegalCrossThreadCalls = true;
            Thread t = new Thread(test);
            t.Start();
}

public void test()
{
      //Bitmap b = new Bitmap(@"c:\aaa.bmp");
      // this.pictureBox1.Image = b;
    //  this.textBox1.Text = "sss";
    SetText("sss");
}
//-------------
private delegate void SetTextHandler(string str);
        private void SetText(string str)
        {
            if (textBox1.InvokeRequired)
            {
                SetTextHandler handler = SetText;
                textBox1.Invoke(handler, new object[] {str});
            }
            else
            {
                textBox1.Text = str;
            }
            
        }
3个月前   回答者:被偷De贼 - 菜鸟二级
标准WinForm的Handler是不允许跨线程访问的。
因此,如果你的操作没有直接或间接访问到Window的Handle,就不会触发这个异常。而TextBox的Text属性,其实是通过向TextBox的Window Send一个WM_SETTEXT消息实现的,自然要访问Window的Handle,所以触发了异常。
详情,参考我的博客:http://www.cnblogs.com/Cajon/archive/2007/03/21/Multi_Thread_Win_Form.html

1个月前   回答者:Colin Han - 老鸟四级
评论
3个月前   BZZ :
PictureBox 控件在另一个线程中操作属性为什么没有报这样的错误呢??

   您需要登录以后才能回答!
我的问题    我要提问


快到期问题

> 问题排行榜

有不合适内容,建议去除