• 跨线程调用控件


    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]
                }
            }
        }
    }

  • 相关阅读:
    详解ASP.NET页面的asp“.NET研究”x扩展 狼人:
    Microsoft NLa“.NET研究”yerApp案例理论与实践 多层架构与应用系统设计原则 狼人:
    HTML5 搭建“.NET研究”移动Web应用 狼人:
    VS201“.NET研究”0 C++下编译调试MongoDB源码 狼人:
    Silverlight 的多线程能力(下“.NET技术”) 狼人:
    Log4Net 全方“.NET技术”位跟踪程序运行 狼人:
    三种属性操作性能比较:PropertyInfo + Expression Tree + Delega“.NET技术”te.CreateDelegate 狼人:
    .NET简谈观察者“.NET技术”模式 狼人:
    Microsoft NLayerApp案例理论与实践 项目简“.NET研究”介与环境搭建 狼人:
    “.NET研究”专访微软MVP衣明志:走进ASP.NET MVC 2框架开发 狼人:
  • 原文地址:https://www.cnblogs.com/gaotaozhaolei/p/1277831.html
Copyright © 2020-2023  润新知