跨线程调用控件

摘要:
在vs2005中,默认情况下不允许跨线程调用控件,否则将发生错误。但也有一个解决方案:以下内容发布在VS2005中。考虑到线程安全,不允许跨线程调用控件!

vs2005中默认是不允许跨线程调用控件的,否则会出错。但是也有解决办法:

以下内容为转贴

在VS 2005  中考虑到线程的安全性,不允许跨线程调用控件!  为了解决这一问题 

 1. 将Control 的 CheckForIllegalCrossThreadCalls 属性设置为假, 不去捕获错误线程的调用,但这种做法是不安全的!

2.使用委托异步调用 

见代码:

 

 

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace TabSelect
...{
    class MyThread
    ...{
        public delegate void SetLabelText(string text);   //定义委托
        Control  control;

        Thread thread;
        ThreadStart start;
        int num2;

        构造方法,初始化线程,以及要改变属性的控件#region  构造方法,初始化线程,以及要改变属性的控件
        public MyThread(Control control,int  num)
        ...{
            this.control = control;
            start = new ThreadStart(BuildNum2);   //订阅线程要执行的代码
            this.num2 = num;
            thread = new Thread(start);

            thread.Start();
        }
        #endregion 

        线程中需要执行的方法  通过设置Control 属性,指示是否捕获错误线程的调用#region 线程中需要执行的方法  通过设置Control 属性,指示是否捕获错误线程的调用
        public void BuildNum()   
        ...{     
             Random random = new Random(num2);
             Control.CheckForIllegalCrossThreadCalls = false; [Page]

             do
             ...{
                 int num = random.Next(0, 10);
                 control.Text = num.ToString();
                 Thread.Sleep(100);
             } while (true);

         }
        #endregion 

        方法二,使用委托异步调用#region  方法二,使用委托异步调用
         public void BuildNum2()  
        ...{
            Random myRand = new Random(num2);

            while (true)
            ...{
                SetText(myRand.Next(0, 10).ToString());
                Thread.Sleep(100);
            }
        }
           #endregion


        改变UI 线程的控件属性#region 改变UI 线程的控件属性
        public void SetText(string  str)
        ...{
            if (control.InvokeRequired)
            ...{
                SetLabelText  setLableText  = new SetLabelText(SetText);
                control.Invoke(setLableText, new object[] ...{ str}); [Page]
            }
            else
            ...{
                control.Text = str;
            }
        }
        #endregion


        public void Kill()
        ...{
            thread.Abort();

        }
    }
}

 

界面

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace TabSelect
...{
    public partial class Form2 : Form
    ...{

        Point myPoint;
        private bool isMouseDown;
        private bool isStart = true;

        MyThread m;
        MyThread m2;
        MyThread m3;
        public Form2()
        ...{
            InitializeComponent();
        }

        private void label4_Click(object sender, EventArgs e)
        ...{
            this.Close();

            Application.Exit();
         
        }

       

        private void Form2_MouseDown(object sender, MouseEventArgs e) [Page]
        ...{
            if (e.Button == MouseButtons.Left)
            ...{
                myPoint = new Point(-e.X,-e.Y);
                isMouseDown = true;
            }
        }

        private void Form2_MouseMove(object sender, MouseEventArgs e)
        ...{
                if (isMouseDown == true)
                ...{
                    Point newPoint = Control.MousePosition;
                    newPoint.Offset( myPoint.X,myPoint.Y);
                    this.Location = newPoint;
                }    
        }

        private void Form2_MouseUp(object sender, MouseEventArgs e)
        ...{
            if (e.Button == MouseButtons.Left)
            ...{
                isMouseDown = false;
            }
        }

        private void Form2_Load(object sender, EventArgs e)
        ...{ [Page]
          
        }

        private void timer1_Tick(object sender, EventArgs e)
        ...{
            Random myRandom = new Random();

            label1.Text = myRandom.Next(0, 10).ToString();
        }

        private void button1_Click(object sender, EventArgs e)
        ...{
            if (isStart == true)
            ...{
                  m = new MyThread(label1,1000);
                  m2 = new MyThread(label2,1111);
                  m3 = new MyThread(label3, 2222);
               
                  isStart = false;
                  button1.Text = ""结束"";
            }
            else
            ...{
                m.Kill();
                m2.Kill();
                m3.Kill();
                isStart = true;

                button1.Text = ""开始""; [Page]
            }
        }
    }
}

免责声明:文章转载自《跨线程调用控件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Tomcat7基于Redis的Session共享实战一Emacs的undo与redo下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JMeter测试clickhouse

使用JMeter对clickhouse连接测试 1、测试计划 jmeter通过JDBC连接数据库需要先引入对应的驱动包,驱动包的版本要与服务器数据库版本一致,我用的驱动版本是:clickhouse-jdbc-0.1.54.jar; 可以将连接数据库相关的驱动直接放到lib目录下(不建议,需要重启JMeter),或者在lib/ext文件夹创建个对应的目录,将...

golang 之GPM模型

1、Golang调度器的由来 2、Goroutine调度器的GMP模型及设计思想 3、Goroutine调度场景过程全图文解析 早期的单进程操作系统,面临2个问题: 1.单一的执行流程,计算机只能一个任务一个任务处理。 2.进程阻塞所带来的CPU时间浪费。 多进程/线程时代有了调度器需求: 进程拥有太多的资源,进程的创建、切换、销毁,都会占用很长的时间,...

c#之多线程之为所欲为

一 什么是多线程 1、 什么是进程?一个 exe 运行一次就会产生一个进程,一个 exe 的多个进程之 间数据互相隔离。 2、 一个进程里至少有一个线程:主线程。我们平时写的控制台程序默认就是单线程的,代 码从上往下执行,一行执行完了再执行下一行; 3、 什么是多线程:一个人两件事情同时做效率高。同一时刻一 个人只能干一件事情,其实是在“快速频繁切换”,如...

当析构函数遇到多线程 ── C++ 中线程安全的对象回调

陈硕 (giantchen_AT_gmail) 本文 PDF  下载: http://www.cppblog.com/Files/Solstice/dtor_meets_mt.pdf 摘要 编写线程安全的类不是难事,用同步原语保护内部状态即可。但是对象的生与死不能由对象自身拥有的互斥器来保护。如何保证即将析构对象 x 的时候,不会有另一个线程正在调用...

2019-1-29-C#-Task.Run-和-Task.Factory.StartNew-区别

title author date CreateTime categories C# Task.Run 和 Task.Factory.StartNew 区别 lindexi 2019-01-29 16:14:52 +0800 2018-06-16 16:22:49 +0800 C# 有小伙伴问我,为什么不推荐他使用 Task.Factory....

通过 Javacore 了解线程运行状况

Javacore 是一个当前 JVM 运行状态的快照。通过对Javacore 的分析,可以了解在 JVM 中运行的应用程序的当前状态,比如是否“卡”在某一点上,或在某些代码上运行时间太长。 Javacore 的基本内容 Javacore,也可以称为“threaddump”或是“javadump”,它是 Java 提供的一种诊断特性,能够提供一份可读的当前运...