線程的簡單使用之進度條


我們可能在程序里經常會使用到進度條這樣的東西,本人是個菜鳥,第一次寫這種東西的時候思路是這樣的,不多說上代碼

這是界面

        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i<100;i++ )
            {
                Thread.Sleep(1000);//此處停一秒
                this.progressBar1.Value = i;
                this.label1.Text = i.ToString();
            }
        }

不出意外的話應該就卡死了,這就是所謂的卡UI,然后本人就在想是不是因為刷新(不知道怎么表達,但好像就是這種感覺),於是本菜鳥給Form1加了一個timer

並把代碼改成這樣子:

   private void button1_Click(object sender, EventArgs e)
        {
            timer1.Interval = 100;
            timer1.Start();
            timer1.Tick += timer1_Tick;
        }
        int value = 0;
        void timer1_Tick(object sender, EventArgs e)
        {

            if(value==101)
            {
                timer1.Stop();
                MessageBox.Show("完成");
                return;
            }
            this.progressBar1.Value = value;
            this.label1.Text = value.ToString()+"%";
            value++;
        }

但是總感覺怪怪的,然后上網查了下,知道了線程

然后一般正確的使用姿勢

        delegate void MyDel(int v);
        private void button1_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(new ThreadStart(Test));//實例化一個線程
            thread.Start();//開啟線程
        }

        private void Test()
        {
            MyDel mydel = ChangeUI;
            for (int i = 0; i < 100; i++)
            {
                Thread.Sleep(100);//此處阻塞100毫秒
                this.Invoke(mydel,i);
            }

        }

        private void ChangeUI(int value)
        {
            this.progressBar1.Value = value;
            this.label1.Text = value + "%";
        }

不知Invoke用法的請移步我另一個隨筆:    http://www.cnblogs.com/shitong/p/5763775.html

這是沒有參數的線程,線程還有一個可以傳參數的如下:

        private void button1_Click(object sender, EventArgs e)
        {


            ParameterizedThreadStart pts = new ParameterizedThreadStart(Test1);
            ThreadStart ts = new ThreadStart(Test);//線程調用的方法
            Thread thread = new Thread(ts);//實例化一個線程
            Thread thread2 = new Thread(pts);
            thread.Start();//開啟線程
            thread2.Start("object類型的參數");
        }
        public void Test1(object obj)
        {
            string s = (string)obj;
        }

好啦,由於本菜鳥很菜,就寫到這了,以后等本菜鳥玩的比較6了,再拿出來和大家分享

 


免責聲明!

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



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