黑马程序员技术交流社区

标题: 关于多线程的小问题 [打印本页]

作者: popoluno    时间: 2013-6-15 13:03
标题: 关于多线程的小问题
我第一次使用线程,有这么个问题:我再窗体上放了一个listBox1,创建了两个线程,我再线程中访问这个listBox1的时候,系统说不能跨线程调用控件,这怎么回事 ,怎么解决??
代码如下:
        private void Form1_Load(object sender, EventArgs e)
        {
            //创建线程 需要System.Threading命名空间
            Thread t1, t2; // 说明为窗体类成员
            t1 = new Thread(new ThreadStart(BackgroundProcess));
            t1.Start();    //启动线程t1
        }
        private void BackgroundProcess()
        {
            int i = 1;
            while (true)
            {
                // 向列表框增加一个项目
                listBox1.Items.Add("Iterations: " + i.ToString());

i++;
                Thread.Sleep(2000); // 指定线程休眠的时间
            }
           
        }


作者: 许庭洲    时间: 2013-6-15 14:31
Control.CheckForIllegalCrossThreadCalls = false;  //跨越线程调用windows控件
作者: 风雪再现    时间: 2013-6-15 14:33
微软自带的有线程间调用的检查,只要关闭这个就可以了,目前我就知道这一种方法
public 客户端()
        {
            InitializeComponent();
            TextBox.CheckForIllegalCrossThreadCalls = false;//关闭线程之间的检查,相信你应该知道这个位置,程序最上面
        }

作者: 无__畏    时间: 2013-6-15 16:25
本帖最后由 无__畏 于 2013-6-15 17:00 编辑
  1. int i = 0;
  2.         private void Form1_Load(object sender, EventArgs e)
  3.         {
  4.             //创建线程 需要System.Threading命名空间
  5.             Thread t1, t2; // 说明为窗体类成员
  6.             t1 = new Thread(new ThreadStart(BackgroundProcess));
  7.             t1.Start();    //启动线程t1
  8.         }

  9.         delegate void FunDel();
  10.         private void BackgroundProcess()
  11.         {
  12.             while (true)
  13.             {
  14.                 Function();
  15.                 Thread.Sleep(2000);
  16.             }
  17.         }

  18.         private void Function()
  19.         {
  20.             if (this.listBox1.InvokeRequired)
  21.             {
  22.                 FunDel del = new FunDel(BackgroundProcess);
  23.                 this.BeginInvoke(del);
  24.             }
  25.             else
  26.             {
  27.                 i++;
  28.                 listBox1.Items.Add(i);
  29.             }
  30.         }
  31.     }
复制代码

作者: aa26963    时间: 2013-6-15 18:49
public Form1()
        {
            InitializeComponent();
            TextBox.CheckForIllegalCrossThreadCalls = false;//加上这句话,关闭跨线程之间的检查。
        }




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2