新疆软件开发

本站首页 软件开发 成功案例 公司新闻 公司简介 客服中心 软件技术 网站建设
  您现在的位置: 新疆二域软件开发公司 >> 开发语言 >> 文章正文

实现跨线程调用控件

在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;

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});

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

  ...{
            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)
        ...{

  }

        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 = "开始";

    }
        }
    }
}

作者:未知 | 文章来源:自学编程网 | 更新时间:2008-1-7 18:51:12

  • 上一篇文章:

  • 下一篇文章:

  • 相关文章:
    没有相关文章
    软件技术
    · 开发语言
    · Java技术
    · .Net技术
    · 数据库开发
    最新文章  
    ·搜集整理的asp.net的验证方
    ·各种FOR循环结构的整理
    ·软件项目开发中应该考虑那
    ·搜集整理的javascript sel
    ·软件开发中项目经理有那些
    ·学习如何在Lambda表达式进
    ·C++基础知识:结构体数据的
    ·C#实现短信发送程序的例子
    ·sun最近修补了一部分java的
    ·rss定制的另外一种实现方式
    ·delphi实现利用arp欺骗来实
    ·基础学习:基于WF的流程框
    ·网络编程中怎样得知一次数
    ·如何逆序输出单链表?
    ·软件开发过程中的性能设计
    关于我们 | 软件开发 | 下载试用 | 客服中心 | 联系我们 | 友情链接 | 网站地图 | 新疆电子地图 | RSS订阅
    版权所有 © 2016 新疆二域软件开发网 www.k8w.net All Rights Reserved 新ICP备14003571号
    新疆软件开发总机:0991-4842803、4811639.
    客服QQ:596589785 ;地址:新疆乌鲁木齐北京中路华联大厦A-5C 邮编:830000