WinForm中 事件 委托 多線程的應用【以一個下載進度條為例】


第一步:首先我們創建一個winfor的項目

第二步:我們建一個窗體
在一個窗體里面 打開一個另外的窗體 另外的窗體有一個按鈕 點擊后就開始下載 下載完成后 在注冊窗體上面 顯示下載完成(達到在一個窗體里面修改另外的一個窗體)

        private void button1_Click(object sender, EventArgs e)
        {
            FormLoad fl = new FormLoad();
            fl.Show();
        }

 第三步:完成下載窗體的進度條

        
private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i <= 100; i++)
            {
                this.progressBar1.Value = i;
                System.Threading.Thread.Sleep(300);
            }
        }

第四步:處理窗體假死問題
(用到多線程和委托)

public partial class FormLoad : Form
    {
        public FormLoad()
        {
            InitializeComponent();
            //為這個委托變量賦值
            changeProgerss = FunChangeProgress;
        }

        public void FunChangeProgress(int value)
        {
            this.progressBar1.Value = value;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //創建一個線程
            System.Threading.Thread thr = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(Download));
            thr.Start(100);
        }

        //線程方法 一定要是obje 類型參數 同時返回值是void
        private  void Download(object obj)
        {
            for (int i = 0; i <= 100; i++)
            {
                //執行委托
                changeProgerss(i);
                System.Threading.Thread.Sleep(300);
            }
        }

        //在下載窗體上面 建一個委托
        public delegate void ChangeProgress(int value);
        //創建上面的委托的變量
        public ChangeProgress changeProgerss;

    }

第五步:處理跨線程調用ui
線程間操作無效: 從不是創建控件“progressBar1”的線程訪問它。

 
      for (int i = 0; i <= 100; i++)
            {
                //執行委托
                this.progressBar1.Invoke(changeProgerss, i);
                //changeProgerss(i);
                System.Threading.Thread.Sleep(300);
            }

 

第六步 主窗體添加委托 解決跨線程調用UI

        public FormMain()
        {
            InitializeComponent();
            sif = ShowInfoFun;
        }

        public void ShowInfoFun(string text)
        {
            this.label1.Text = text;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            FormLoad fl = new FormLoad();
            //在主窗體中注冊子窗體的事件
            fl.eventShowInfo += new FormLoad.ShowInfo(fl_eventShowInfo);
            fl.Show();
        }

        //事件的執行方法
        void fl_eventShowInfo(string text)
        {
            this.label1.Invoke(sif, text);
        }

        //在主窗體這里 創建一個委托
        public delegate void ShowInfo(string text);
        public ShowInfo sif;
    }

視頻下載地址:http://pan.baidu.com/share/link?shareid=1740683788&uk=540184145

需要源碼的可以到這里向樓主要:http://www.bamn.cn/redirect.php?tid=19&goto=lastpost#lastpost


免責聲明!

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



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