c#中使用多线程

| 1 Comment

 

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;


using System.Threading;


namespace student
{
 /// <summary>
 /// Form1 的摘要说明。
 /// </summary>
 public class Form1 : System.Windows.Forms.Form
 {
  private System.Windows.Forms.Button button1;
  private System.Windows.Forms.Button button2;
  private System.Windows.Forms.Button button3;


  ArrayList threads = new ArrayList();


  private System.Windows.Forms.ListView listView1;
  private System.Windows.Forms.ColumnHeader columnHeader1;
  private System.Windows.Forms.ColumnHeader columnHeader2;
  /// <summary>
  /// 必需的设计器变量。
  /// </summary>
  private System.ComponentModel.Container components = null;


  public Form1()
  {
   //
   // Windows 窗体设计器支持所必需的
   //
   InitializeComponent();


   //
   // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
   //
  }


  /// <summary>
  /// 清理所有正在使用的资源。
  /// </summary>
  protected override void Dispose( bool disposing )
  {
   if( disposing )
   {
    if (components != null)
    {
     components.Dispose();
    }
   }
   base.Dispose( disposing );
  }


  #region Windows 窗体设计器生成的代码
  /// <summary>
  /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  /// 此方法的内容。
  /// </summary>
  private void InitializeComponent()
  {
   this.button1 = new System.Windows.Forms.Button();
   this.button2 = new System.Windows.Forms.Button();
   this.button3 = new System.Windows.Forms.Button();
   this.listView1 = new System.Windows.Forms.ListView();
   this.columnHeader1 = new System.Windows.Forms.ColumnHeader();
   this.columnHeader2 = new System.Windows.Forms.ColumnHeader();
   this.SuspendLayout();
   //
   // button1
   //
   this.button1.Location = new System.Drawing.Point(24, 216);
   this.button1.Name = "button1";
   this.button1.TabIndex = 1;
   this.button1.Text = "Add";
   this.button1.Click += new System.EventHandler(this.button1_Click);
   //
   // button2
   //
   this.button2.Location = new System.Drawing.Point(104, 216);
   this.button2.Name = "button2";
   this.button2.TabIndex = 2;
   this.button2.Text = "Del";
   this.button2.Click += new System.EventHandler(this.button2_Click);
   //
   // button3
   //
   this.button3.Location = new System.Drawing.Point(184, 216);
   this.button3.Name = "button3";
   this.button3.TabIndex = 3;
   this.button3.Text = "DelAll";
   this.button3.Click += new System.EventHandler(this.button3_Click);
   //
   // listView1
   //
   this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
                      this.columnHeader1,
                      this.columnHeader2});
   this.listView1.FullRowSelect = true;
   this.listView1.GridLines = true;
   this.listView1.Location = new System.Drawing.Point(0, 0);
   this.listView1.Name = "listView1";
   this.listView1.Size = new System.Drawing.Size(288, 208);
   this.listView1.TabIndex = 5;
   this.listView1.View = System.Windows.Forms.View.Details;
   //
   // columnHeader1
   //
   this.columnHeader1.Text = "线程编号";
   this.columnHeader1.Width = 81;
   //
   // columnHeader2
   //
   this.columnHeader2.Text = "value";
   this.columnHeader2.Width = 180;
   //
   // Form1
   //
   this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
   this.ClientSize = new System.Drawing.Size(292, 266);
   this.Controls.Add(this.listView1);
   this.Controls.Add(this.button3);
   this.Controls.Add(this.button2);
   this.Controls.Add(this.button1);
   this.Name = "Form1";
   this.Text = "Form1";
   this.Load += new System.EventHandler(this.Form1_Load);
   this.ResumeLayout(false);


  }
  #endregion


  /// <summary>
  /// 应用程序的主入口点。
  /// </summary>
  [STAThread]
  static void Main()
  {
   Application.Run(new Form1());
  }


  private void Form1_Load(object sender, System.EventArgs e)
  {
  
  }


  private void button1_Click(object sender, System.EventArgs e)
  {
   Add();
  }


  private void button2_Click(object sender, System.EventArgs e)
  {
   Del();
  }


  private void button3_Click(object sender, System.EventArgs e)
  {


   while(threads.Count>0)
   {
    Thread t1 = (Thread)threads[0];
    if(t1.IsAlive)
    {
     t1.Abort();
    }
    threads.RemoveAt(0);
    lock(listView1)
    {
     listView1.Items.RemoveAt(0);
    }
   }
  }


  private void Add()
  {
   int count = threads.Count;
   if(count<10)
   {
    Thread t = new Thread(new ThreadStart(Process));
    t.Start();
    threads.Add(t);
    lock(listView1)
    {
     listView1.Items.Insert(count, new ListViewItem(new string[]{count.ToString(),"0"}));
    }
   }
  }


  private void Del()
  {
   int count = threads.Count;
   if(count>0)
   {
    Thread t1 = (Thread)threads[count-1];
    if(t1.IsAlive)
    {
     t1.Abort();
    }
    threads.RemoveAt(count-1);
    lock(listView1)
    {
     listView1.Items.RemoveAt(count-1);
    }
   }
  }



  private void Process()
  {
   int i = 1;
   while(true)
   {
    i++;
    int j = threads.IndexOf(Thread.CurrentThread);
    lock(listView1)
    {
     listView1.Items[j].SubItems[1].Text = i.ToString();
    }
    Thread.Sleep(0);
   }
  }
 }
}

1 Comment

 

接上节多线程学习:http://blog.csdn.net/iuhxq/archive/2005/10/12/500295.aspx


本节把Form主线程从其他线程分离出来,实现数据从线程的传入传出


代码如下:


From1.cs代码如下:


using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;


using System.Threading;


namespace student
{
 /// <summary>
 /// http://blog.csdn.net/iuhxq
 /// </summary>
 public class Form1 : System.Windows.Forms.Form
 {
  private System.Windows.Forms.Button button1;
  private System.Windows.Forms.Button button2;
  private System.Windows.Forms.Button button3;


  private Class1 c;


  private System.Windows.Forms.ListView listView1;
  private System.Windows.Forms.ColumnHeader columnHeader1;
  private System.Windows.Forms.ColumnHeader columnHeader2;
  /// <summary>
  /// 必需的设计器变量。
  /// </summary>
  private System.ComponentModel.Container components = null;


  public Form1()
  {
   //
   // Windows 窗体设计器支持所必需的
   //
   InitializeComponent();


   //
   // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
   //
  }


  /// <summary>
  /// 清理所有正在使用的资源。
  /// </summary>
  protected override void Dispose( bool disposing )
  {
   if( disposing )
   {
    if (components != null)
    {
     components.Dispose();
    }
   }
   base.Dispose( disposing );
  }


  #region Windows 窗体设计器生成的代码
  /// <summary>
  /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  /// 此方法的内容。
  /// </summary>
  private void InitializeComponent()
  {
   //
   // Class1初始化
   //
   this.c = new Class1();
   this.c.Update += new student.Class1.EventHandler(c_Update);


   this.button1 = new System.Windows.Forms.Button();
   this.button2 = new System.Windows.Forms.Button();
   this.button3 = new System.Windows.Forms.Button();
   this.listView1 = new System.Windows.Forms.ListView();
   this.columnHeader1 = new System.Windows.Forms.ColumnHeader();
   this.columnHeader2 = new System.Windows.Forms.ColumnHeader();
   this.SuspendLayout();
   //
   // button1
   //
   this.button1.Location = new System.Drawing.Point(24, 216);
   this.button1.Name = "button1";
   this.button1.TabIndex = 1;
   this.button1.Text = "Add";
   this.button1.Click += new System.EventHandler(this.button1_Click);
   //
   // button2
   //
   this.button2.Location = new System.Drawing.Point(104, 216);
   this.button2.Name = "button2";
   this.button2.TabIndex = 2;
   this.button2.Text = "Del";
   this.button2.Click += new System.EventHandler(this.button2_Click);
   //
   // button3
   //
   this.button3.Location = new System.Drawing.Point(184, 216);
   this.button3.Name = "button3";
   this.button3.TabIndex = 3;
   this.button3.Text = "DelAll";
   //
   // listView1
   //
   this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
                      this.columnHeader1,
                      this.columnHeader2});
   this.listView1.FullRowSelect = true;
   this.listView1.GridLines = true;
   this.listView1.Location = new System.Drawing.Point(0, 0);
   this.listView1.Name = "listView1";
   this.listView1.Size = new System.Drawing.Size(288, 208);
   this.listView1.TabIndex = 5;
   this.listView1.View = System.Windows.Forms.View.Details;
   //
   // columnHeader1
   //
   this.columnHeader1.Text = "线程编号";
   this.columnHeader1.Width = 81;
   //
   // columnHeader2
   //
   this.columnHeader2.Text = "value";
   this.columnHeader2.Width = 180;
   //
   // Form1
   //
   this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
   this.ClientSize = new System.Drawing.Size(292, 266);
   this.Controls.Add(this.listView1);
   this.Controls.Add(this.button3);
   this.Controls.Add(this.button2);
   this.Controls.Add(this.button1);
   this.Name = "Form1";
   this.Text = "Form1";
   this.Load += new System.EventHandler(this.Form1_Load);
   this.ResumeLayout(false);


  }
  #endregion


  /// <summary>
  /// 应用程序的主入口点。
  /// </summary>
  [STAThread]
  static void Main()
  {
   Application.Run(new Form1());
  }


  private void Form1_Load(object sender, System.EventArgs e)
  {
  }


  private void c_Update(int index)
  {
   listView1.Items[index].SubItems[1].Text = c.Result[index].ToString();
  }


  private void button1_Click(object sender, System.EventArgs e)
  {
   listView1.Items.Add(new ListViewItem(new string[]{c.Result.Count.ToString(),"0"}));
   c.Add();
  }


  private void button2_Click(object sender, System.EventArgs e)
  {
   int index = c.Del();
   if(index>=0)
   {
    listView1.Items.RemoveAt(index);
   }
  }
 }
}
添加类Class1:


Class1代码如下:


using System;
using System.Collections;
using System.Threading;


namespace student
{
 /// <summary>
 /// Class1 的摘要说明。
 /// </summary>
 public class Class1
 {


  public ArrayList Threads = new ArrayList();
  public ArrayList Result = new ArrayList();


  public event EventHandler Update;
  public delegate void EventHandler(int index);
  
  public Class1()
  {
   //
   // TODO: http://blog.csdn.net/iuhxq
   //
   Update += new EventHandler(Class1_Update);
  }


  private void Process()
  {
   int i = 1;
   while(true)
   {
    i++;
    int index = Threads.IndexOf(Thread.CurrentThread);
    Result[index] = i;
    if(Update!=null)Update(index);
    Thread.Sleep(0);
   }
  }


  public int Add()
  {
   Thread t = new Thread(new ThreadStart(Process));
   t.Start();
   Threads.Add(t);
   lock(Result)
   {
    Result.Add(0);
   }
   return Threads.Count-1;
  }


  public int Del()
  {
   int count = Threads.Count;
   if(count>0)
   {
    Thread t1 = (Thread)Threads[count-1];
    if(t1.IsAlive)
    {
     t1.Abort();
    }
    Threads.RemoveAt(count-1);
    lock(Result)
    {
     Result.RemoveAt(count-1);
    }
   }
   return count-1;
  }


  private void Class1_Update(int index)
  {


  }
 }
}

About this Entry

This page contains a single entry by Sky published on October 19, 2005 11:21 AM.

一个很不错介绍session的文章 was the previous entry in this blog.

使用ORACLE诊断事件 is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.