C# 通過委托控制進度條以及多線程更新控件


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;  
using System.Threading;  
  
namespace Demo0004  
{  
    public partial class Form1 : Form  
    {  
        public Form1()  
        {  
            InitializeComponent();  
        }  
  
        //線程開始的時候調用的委托  
        private delegate void maxValueDelegate(int maxValue);  
        //線程執行中調用的委托  
        private delegate void nowValueDelegate(int nowValue);  
  
        private void button1_Click(object sender, EventArgs e)  
        {  
            ThreadMethod method = new ThreadMethod();  
            //先訂閱一下事件  
            method.threadStartEvent += new EventHandler(method_threadStartEvent);  
            method.threadEvent += new EventHandler(method_threadEvent);  
            method.threadEndEvent += new EventHandler(method_threadEndEvent);  
  
            Thread thread = new Thread(new ThreadStart(method.runMethod));  
            thread.Start();  
        }  
  
        /// <summary>  
        /// 線程開始事件,設置進度條最大值  
        /// 但是我不能直接操作進度條,需要一個委托來替我完成  
        /// </summary>  
        /// <param name="sender">ThreadMethod函數中傳過來的最大值</param>  
        /// <param name="e"></param>  
        void method_threadStartEvent(object sender, EventArgs e)  
        {  
            int maxValue = Convert.ToInt32(sender);  
            maxValueDelegate max = new maxValueDelegate(setMax);  
            this.Invoke(max, maxValue);  
        }  
  
        /// <summary>  
        /// 線程執行中的事件,設置進度條當前進度  
        /// 但是我不能直接操作進度條,需要一個委托來替我完成  
        /// </summary>  
        /// <param name="sender">ThreadMethod函數中傳過來的當前值</param>  
        /// <param name="e"></param>  
        void method_threadEvent(object sender, EventArgs e)  
        {  
            int nowValue = Convert.ToInt32(sender);  
            nowValueDelegate now = new nowValueDelegate(setNow);  
            this.Invoke(now, nowValue);  
        }  
  
        /// <summary>  
        /// 線程完成事件  
        /// </summary>  
        /// <param name="sender"></param>  
        /// <param name="e"></param>  
        void method_threadEndEvent(object sender, EventArgs e)  
        {  
            MessageBox.Show("執行已經完成!");  
        }  
  
        /// <summary>  
        /// 我被委托調用,專門設置進度條最大值的  
        /// </summary>  
        /// <param name="maxValue"></param>  
        private void setMax(int maxValue)  
        {  
            this.progressBar1.Maximum = maxValue;  
        }  
  
        /// <summary>  
        /// 我被委托調用,專門設置進度條當前值的  
        /// </summary>  
        /// <param name="nowValue"></param>  
        private void setNow(int nowValue)  
        {  
            this.progressBar1.Value = nowValue;  
        }  
    }  
  
  
    public class ThreadMethod  
    {  
        /// <summary>  
        /// 線程開始事件  
        /// </summary>  
        public event EventHandler threadStartEvent;  
        /// <summary>  
        /// 線程執行時事件  
        /// </summary>  
        public event EventHandler threadEvent;  
        /// <summary>  
        /// 線程結束事件  
        /// </summary>  
        public event EventHandler threadEndEvent;  
  
        public void runMethod()  
        {  
            int count = 100;      //執行多少次  
            threadStartEvent.Invoke(count, new EventArgs());//通知主界面,我開始了,count用來設置進度條的最大值  
            for (int i = 0; i < count; i++)  
            {  
                Thread.Sleep(100);//休息100毫秒,模擬執行大數據量操作  
                threadEvent.Invoke(i, new EventArgs());//通知主界面我正在執行,i表示進度條當前進度  
            }  
            threadEndEvent.Invoke(new object(), new EventArgs());//通知主界面我已經完成了  
        }  
    }  
} 

 

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;  
using System.Threading;  
  
namespace Demo0004  
{  
    public partial class Form2 : Form  
    {  
        //在下載窗體上面 建一個委托  
        public delegate void ChangeProgress(int value); //進度條  
        public delegate void ChangeButton(int value); //按鈕  
        //創建上面的委托的變量  
        public ChangeProgress changeProgerss;  
        public ChangeButton changebtn;  
  
        public Form2()  
        {  
            InitializeComponent();  
            //為這個委托變量賦值  
            changeProgerss = FunChangeProgress;  
            changebtn = FunChangebutton;  
        }  
  
        //通過創建工作線程消除用戶界面線程的阻塞問題   
        private void button1_Click(object sender, EventArgs e)  
        {  
            button1.Enabled = false;  
            //新創建一個線程  
            System.Threading.Thread thr = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(Download));  
            thr.Start();              
        }  
  
        //線程方法 一定要是object 類型參數 同時返回值是void  
        private void Download(object obj)  
        {  
            for (int i = 0; i <= 100; i++)  
            {  
                //執行委托 更新按鈕  -重點  
                this.button1.Invoke(changebtn, i);  
                //執行委托 更新進度條  -重點  
                this.progressBar1.Invoke(changeProgerss, i);  
                System.Threading.Thread.Sleep(100);  
            }  
        }  
  
        //更新進度條  
        public void FunChangeProgress(int value)  
        {  
            progressBar1.Value = value;  
        }  
  
        //更新按鈕  
        public void FunChangebutton(int value)  
        {  
            if (value == 100)  
            {  
                button1.Text = "開始新進程";  
                button1.Enabled = true;  
            }  
            else  
            {  
                //相除保留兩位小數 且四舍五入 Math.Round(1.00 * value / 100, 2,MidpointRounding.AwayFromZero)  
                button1.Text = Math.Round(1.00 * value / 100, 2,MidpointRounding.AwayFromZero) * 100 + "%";  
            }  
        }  
  
        //窗體關閉 強制退出 銷毀所有相關進程  
        private void Form2_FormClosing(object sender, FormClosingEventArgs e)  
        {  
            //強制退出 銷毀進程  
            System.Environment.Exit(System.Environment.ExitCode);  
            this.Dispose();  
            this.Close();  
        }  
    }  
}  

 

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 Demo0004  
{  
    public partial class Form3 : Form  
    {  
        public delegate void ChangeStatus();  
        //創建上面的委托的變量    
        public ChangeStatus changestatus;  
        public Form3()  
        {  
            InitializeComponent();  
        }  
  
        private void Form3_Load(object sender, EventArgs e)  
        {  
            //使用Timer組件實現多線程定時同步  
            System.Timers.Timer t = new System.Timers.Timer(3000);   //實例化Timer類,設置間隔時間單位毫秒;   
            t.Elapsed += new System.Timers.ElapsedEventHandler(UpdateWork); //到達時間的時候執行事件;     
            t.AutoReset = true;   //設置是執行一次(false)還是一直執行(true);     
            t.Enabled = true;     //是否執行System.Timers.Timer.Elapsed事件;     
            changestatus = FunChangeStatus;    
        }  
  
        private void UpdateWork(object source, System.Timers.ElapsedEventArgs e)  
        {  
            this.Invoke(changestatus);  
        }  
  
        //更新  
        public void FunChangeStatus()  
        {  
            #region 更新開始  
            //更新方法  
            #endregion  
            lbtimer.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 數據更新成功";  
        }  
    }  
}  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM