這是一個Thread的簡單應用,利用一個Thread在背景執行,每一秒設定Form上的元件來顯示時分秒,因為Form上的元件不能在其它不是Form本身Thread的執行緒上執行,所以要利用Form的invoke來呼叫Delegate Function設定元件值。
Label1是時、Label2是分、Label3秒,然後run這個function每一秒會去加秒數,當為六十秒時自動幫分加一,而秒數變零,當分為六十分時,自動幫時加一,而分變零,當時為二十四時,時變零。
Form的設定如下:
以下是執行畫面:
程式碼重點如下:
changeTime Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WindowsFormsApplication1
{
class ChangeTime
{
private Form1 form;
private Boolean state = true;
private int h;
private int m;
private int s;
public ChangeTime(Form1 form1)
{
this.form = form1;
//設定預設的起始時間
DateTime date = DateTime.Now;
h = date.Hour;
m = date.Minute;
s = date.Second;
}
//停止thread,在fomr Dispose時要把thread也設定關掉
public void stop()
{
state = false;
}
public void run()
{
while (state)
{
s++;
if (s / 60 == 1)
{
s = s - 60;
m++;
if (m / 60 == 1)
{
m = m - 60;
h++;
if (h / 24 == 1)
{
h = h - 24;
}
}
}
//一定要使用form裡的thread才可以變動form上的元件內容,其它thread更動時會有問題
//利用invoke來執行form的thread
if (state)//如果已經Dispose掉了就不再invoke了
{
form.Invoke(new Form1.InvokeFunction(form.setTime), new object[] { h, m, s });
}
//一秒執行一次
System.Threading.Thread.Sleep(1000);//停一秒
}
}
}
}
Form1 Class
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private ChangeTime timechange;
public Form1()
{
InitializeComponent();
//產生一個類別,專門來管理時間運作
timechange = new ChangeTime(this);
//timechange.change();
//使用一個thread來增加時間的秒數
System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(timechange.run));
thread.Start();
//this.
}
//委派function
public delegate void InvokeFunction(int h, int m, int s);
//設定時間
public void setTime(int h,int m,int s)
{
setHH(h);
setMM(m);
setSS(s);
}
public void setHH(int h)
{
this.label1.Text = h.ToString();
}
public void setMM(int m)
{
this.label2.Text = m.ToString();
}
public void setSS(int s)
{
this.label3.Text = s.ToString();
}
}
}
Form1.Desinger.cs重點部份
protected override void Dispose(bool disposing)
{
//把thread停掉
timechange.stop();
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}