[C#]簡單的GUI Form時鐘程式

這是一個Thread的簡單應用,利用一個Thread在背景執行,每一秒設定Form上的元件來顯示時分秒,因為Form上的元件不能在其它不是Form本身Thread的執行緒上執行,所以要利用Form的invoke來呼叫Delegate Function設定元件值。

Label1是時、Label2是分、Label3秒,然後run這個function每一秒會去加秒數,當為六十秒時自動幫分加一,而秒數變零,當分為六十分時,自動幫時加一,而分變零,當時為二十四時,時變零。

Form的設定如下:

C#時鐘form

以下是執行畫面:

C#時鐘執行中




程式碼重點如下:

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

執行檔下載
原始檔下載

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料