代码改变世界

关于线程和线程消息传递

2007-10-29 23:49  Animax!  阅读(375)  评论(0编辑  收藏  举报
首先,线程 Thread 存在于 System.Threading 命名空间.

简单调用线程的示例:

首先需要加入命名空间
using System.Threading;
主要代码
 1         void Main()
 2         {
 3             ThreadStart TStart = new ThreadStart(run);
 4             Thread thread = new Thread(TStart );
 5             thread.Start();
 6         }
 7 
 8         void run()
 9         {
10             //线程工作的代码
11         }

其中ThreadStart是一个委托,用于 表示在 Thread 上执行的方法。

可以在
thread.Start() 之前更改线程的属性
thread.IsBackground = this;
是线程成为后台线程。 程序结束时候(我理解是当主线程结束时候)关闭此线程。


注:.net 2.0 也就是使用 VS05的时候  可以直接这样写:
Thread thread = new Thread(run);



然后, 就是如何把需要的信息在线程启动之初传入到线程作处理:
这样就需要把工作的线程封装到一个类中 , 在使用线程时就初始化那个类 , 并把值传进线程

用上面的例子修改一下 :


    
class MainClass
    {
            ThreadClass threadClass 
= new ThreadClass(/*需要传入的值*/);

            ThreadStart TStart 
= new ThreadStart(threadClass.run);
            Thread thread 
= new Thread(TStart);
            thread.Start();
    }

    
class ThreadClass
    {
        
object Parameters;

        
public ThreadClass(object parameters)
        {
            Parameters
= parameters;
        }

        
public void run()
        {
            
// 使用传入的值 Parameters 工作
        }
    }


这样 , 就完成了初始化时给线程传入值了 .

但是在winform 的应用中 , 有时候会需要在线程工作到特定时候修改控件, 或显示一些线程的工作结果 。
这时候就要用到委托了。

再用上面的例子修改一下 :
     // 窗体 class Form
    {
        
// 一个事件
        {
            ThreadClass threadClass 
= new ThreadClass(this);

            ThreadStart TStart 
= new ThreadStart(threadClass.run);
            Thread thread 
= new Thread(TStart);
            thread.Start();
        }

        
public void Change(object Parameters)
        {
            
/* 对控件的操作 */ 
        }


    }

    
class ThreadClass
    {
        
private Form MainForm;
        
public delegate void MyInvoke(object obj);

        
public ThreadClass(Form mainForm)
        {
            MainForm 
= mainForm;
        }

        
public void run()
        {
            MyInvoke Show 
= new MyInvoke(MainForm.Show);
            MainForm.BeginInvoke(Show, 
new object[] { /* 需要传出的值 */ } );
        }
    }

其中 :
public delegate void MyInvoke(object obj);

是自定义的一个委托,委托中的参数和你控制控件的那个过程的参数是一致的 。




嗯 , 就这样~ 本人水平有限 如有错漏 请指出。