跨线程调用控件

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

        
构造方法,初始化线程,以及要改变属性的控件 

        
线程中需要执行的方法  通过设置Control 属性,指示是否捕获错误线程的调用 

        
方法二,使用委托异步调用


        
改变UI 线程的控件属性


        
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(010).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 
= "开始";
            }

        }

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值