C#在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级

首先在form1的窗体载入中新建了一个Class1对象并将本身的引用传递进入其构造函数,然后在Class1的构造函数中创建一个线程。该线程所代理的方法事件是本类中的一个add方法。而add方法的内容则是在form1上放一个textbox.然而这个流程你需要注意的有几个问题:1.哪个是主线程?所谓主线程是第一个启动的线程,是从main开始的。form1的这个窗体是由主线程创建的。2.Thread t的线程是什么?t是由主线程创建的,t的操作内容是在由主线程创建的窗体上放一个textbox.也就是说,t的操作是跨线程的窗体操作。虽然把CheckForIllegalCrossThreadCalls 设置成了false,但是还存在在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级这个异常。
解决办法:1.不要线程,只在一个主线程中操作。此时你在class1中添加控件也好,在form1中写个方法来添加控件也好,都是可行的。2.通过代理来实现。在对form1对象的操作中if(form1.InvokeRequired){  form1.Invoke(d);//d为在主线程中创建的代理引用  //d所代理的方法应该是添加控件的内容}else{  form1.Controls.add(textBox1);//直接使用}//代码  class Class1    {        Form1 f1;        TextBox textBox1;        delegate void addDelegate();        addDelegate d;        public Class1(Form1 f1)         {            this.f1 = f1;            d=new addDelegate(f1.add());//此处的add是在form1中的方法            Thread t = new Thread(new ThreadStart(add));            t.Start();        }        public void add()         {           if(f1.InvokeRequired)             {               f1.Invoke(d); //使用代理             }           else             {               f1.Controls.add(new TextBox());//...直接调用             }        }    }
 
时间: 2024-12-26 13:09:00

C#在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级的相关文章

linux 将一个服务器上的文件或文件夹拷贝到另一个服务器上(转载)

复制文件或目录命令:  复制文件:  (1)将本地文件拷贝到远程  scp 文件名用户名@计算机IP或者计算机名称:远程路径 本地192.168.1.8客户端  scp /root/install.* [email protected]:/usr/local/src (2)从远程将文件拷回本地  scp 用户名@计算机IP或者计算机名称:文件名本地路径 本地192.168.1.8客户端取远程服务器12.11上的文件  scp [email protected]:/usr/local/src/*.

如何定义,创建,启动一个线程

如何定义一个线程?第一通过继承java.lang.Thead类来定义一个线程.第二,通过实现java.lang.runnable接口定义一个线程. 为什么不采用run方法直接启动线程呢?线程是由操作系统来管理的,操作系统启动一个线程,会调用本地的一个代码,这个本地的代码会使系统初始化一个新的线程,由新的线程来启动Thead类中的run方法,所以要通过start方法来启动一个线程 两种定义线程的方式都有哪些优缺点?

[JCIP笔记] (三)如何设计一个线程安全的对象

在当我们谈论线程安全时,我们在谈论什么中,我们讨论了怎样通过Java的synchronize机制去避免几个线程同时访问一个变量时发生问题.忧国忧民的Brian Goetz大神在多年的开发过程中,也悟到了人性的懒惰,他深知许多程序员不会在设计阶段就考虑到线程安全,只是假设自己的代码能按照自己的想法很好地运转.然而当程序上线.线程安全问题真的发生时,要花费多于前期设计数倍的时间和精力去进行排查.解决,甚至重新设计.于是,他在字里行间一直秉持一种"凡事皆可发生"的小心翼翼的哲学,并以这种哲学

java停止一个线程

Thread类中有start(), stop()方法,不过stop方法已经被废弃掉. 平时其实也有用过,共享一个变量,相当于标志,不断检查标志,判断是否退出线程 如果有阻塞,需要使用Thread的interrupt()方中断阻塞,线程开始检查标志(PS:抛出异常不会退出循环) ------------------------------------------------------------我是copy分割线------------------------------------------

JAVA多线程之当一个线程在执行死循环时会影响另外一个线程吗?

一,问题描述 假设有两个线程在并发运行,一个线程执行的代码中含有一个死循环如:while(true)....当该线程在执行while(true)中代码时,另一个线程会有机会执行吗? 二,示例代码(代码来源于互联网) 1 public class Service { 2 Object object1 = new Object(); 3 4 public void methodA() { 5 synchronized (object1) { 6 System.out.println("methodA

java如何正确停止一个线程

Thread类中有start(), stop()方法,不过stop方法已经被废弃掉. 平时其实也有用过,共享一个变量,相当于标志,不断检查标志,判断是否退出线程 如果有阻塞,需要使用Thread的interrupt()方中断阻塞,线程开始检查标志(PS:抛出异常不会退出循环) ------------------------------------------------------------我是copy分割线------------------------------------------

java 加入一个线程、创建有响应的用户界面 。 示例代码

javajava 加入一个线程.创建有响应的用户界面 . 示例代码 来自thinking in java 4 21章  部分代码  目录21.2.11 thinking in java 4免费下载:http://download.csdn.net/detail/liangrui1988/7580155 package org.rui.thread.concurrent; /** * 加入一个线程 * 一个线程可以在其他线程之上调用join()方法,其效果是等待一段时间直到第二个线程结束才继续执行

Java并发(基础知识)—— 创建、运行以及停止一个线程

0.介绍 在计算机世界,当人们谈到并发时,它的意思是一系列的任务在计算机中同时执行.如果计算机有多个处理器或者多核处理器,那么这个同时性是真实发生的:如果计算机只有一个核心处理器那么就只是表面现象. 现代所有的操作系统都允许并发地执行任务.你可以在听音乐和浏览网页新闻的同时阅读邮件,我们说这种并发是进程级别的并发.而且在同一进程内,也会同时有多种任务,这些在同一进程内运行的并发任务称之为线程. 在这里我们要讨论的是线程级并发.Java提供了Thread类,使我们能够在一个Java进程中运行多个线

1418作业(8)多线程 开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID 在屏幕上打印10遍

/****************************************************************************** *题目: 编写一个程序,开启3个线程,这3个线程的ID分别为A.B.C,每个线程将自己的ID * 在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示:如:ABCABC-依次递推. ******************************************************************************