zoukankan      html  css  js  c++  java
  • 线程的简单使用之进度条

    我们可能在程序里经常会使用到进度条这样的东西,本人是个菜鸟,第一次写这种东西的时候思路是这样的,不多说上代码

    这是界面

            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了,再拿出来和大家分享

  • 相关阅读:
    Uva 11806 拉拉队 二进制+容斥原理 经典!
    CSU CHESS
    hdu 4049 Tourism Planning 状态压缩dp
    HDOJ 4661: Message Passing(找递推公式+逆元)
    HDU
    hdu4647(思路啊!)
    spoj 370. Ones and zeros(搜索+同余剪枝+链表存数(可能越界LL))
    URAL
    URAL
    hdu4614 (二分线段树)
  • 原文地址:https://www.cnblogs.com/shitong/p/5763970.html
Copyright © 2011-2022 走看看