首页 新闻 会员 周边

PictureBox控件线程中调用的疑问

0
悬赏园豆:20 [已关闭问题]
<P>如果创建某控件的线程之外的其他线程试图调用该控件,则调试器会引发一个 InvalidOperationException,<BR>并提示消息:“从不是创建控件 control name 的线程访问它。” <BR>下面是部分代码<BR>private void Form2_Load(object sender, EventArgs e)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Form2.CheckForIllegalCrossThreadCalls = true;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread t = new Thread(test);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.Start();<BR>}<BR>public void test()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Bitmap b = new Bitmap(@"c:\aaa.bmp");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // this.pictureBox1.Image = b;</P> <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.textBox1.Text = "sss";<BR>}<BR>在方法test中设置textBox1的Text属性会报出"线程间操作无效: 从不是创建控件“textBox1”的线程访问它。"的错误<BR>而给pictureBox1的Image属性赋值却没有这样的错误,为什么??请高手指点一二.</P>
dfgdfgdfgdfgd的主页 dfgdfgdfgdfgd | 初学一级 | 园豆:190
提问于:2008-03-14 09:51
< >
分享
其他回答(1)
0
原因: 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; } }
孙英雄 | 园豆:857 (小虾三级) | 2008-03-14 12:18
0
标准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
Colin Han | 园豆:3041 (老鸟四级) | 2008-05-24 13:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册