c# - winform多线程进度条实现(progressBar工具)

2024-06-08 1630阅读

0

  由于程序计算耗时较长,需要在耗时的地方加入循环滚动的进度条,经过学习和测试,分享一种Winform加载进度条的方法,经过验证可以达到既定需要,暂时没遇到明显报错,这里将实现过程与代码进行分享。

  1. 创建winform应用程序,加载一个buttom和一个ProgressBar控件,用于触发和显示进度条。

    c# - winform多线程进度条实现(progressBar工具)

2.写两个方法,一个模拟耗时的程序,可以替换为自己的程序,一个用于循环更新进度条ProgressBar的值,这两个方法后面会被两个线程执行。

        // 耗时程序,可以替换为自己的程序
        public void test1()
        {
            DateTime dt1 = DateTime.Now;
            double step;
            while (true)
            {
                DateTime dt2 = DateTime.Now;
                step = dt2.Subtract(dt1).TotalSeconds;
                if (step > 12 )
                {
                    break;
                }
            }
        }
		
		/// 进度条循环方法
        private void startProgress()
        {
            // 显示进度条控件.
            progressBar1.Visible = true;
            // 设置进度条最小值.
            progressBar1.Minimum = 1;
            // 设置进度条最大值.
            progressBar1.Maximum = 15;
            // 设置进度条初始值
            progressBar1.Value = 1;
            // 设置每次增加的步长
            progressBar1.Step = 1;
            // 循环执行
            int x = 0;
            while (x 
                if (stop == true)
                {
                    progressBar1.Value = 15;
                    thread2.Abort();
                    break;
                }
                // 每次循环让程序休眠300毫秒
                System.Threading.Thread.Sleep(300);
                // 执行PerformStep()函数
                progressBar1.PerformStep();
                if (x == 15)
                {
                    x = 0;
                    progressBar1.Value = 1;
                    progressBar1.Step = 1;
                }
                x++;
            }
        }

    public partial class Form1 : Form
    {
        bool stop;
        Thread thread2;
        public Form1()
        {
            InitializeComponent();
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            // 初始化progressBar1及控制参数
            stop = false;
            progressBar1.Value = 1;
            progressBar1.Visible = false; // 进度条刚开始不显示
            bool thr1end = false;
            bool thr1over = false;
            Thread thread1 = new Thread(new ThreadStart(test1)); 
            // test1()计算用的主调方法,往往比较耗时  
            thread1.Priority = ThreadPriority.Highest;
            thread1.Start();
            thread2 = new Thread(new ThreadStart(startProgress)); // 更新进度条的值
            thread2.Start();
            // 判断当计算线程执行结束时,控制进度条线程也马上结束
            while (!thr1over)
            {
                thr1end = thread1.IsAlive;
                System.Windows.Forms.Application.DoEvents();
                if (!thr1end || thr1over)
                {
                    thread1.Interrupt();
                    thread1.Abort();
                    stop = true;
                    thr1end = false;
                    break;
                }
            }
        }
        // 耗时程序,可以替换为自己的程序
        public void test1()
        {
            DateTime dt1 = DateTime.Now;
            double step;
            while (true)
            {
                DateTime dt2 = DateTime.Now;
                step = dt2.Subtract(dt1).TotalSeconds;
                if (step  12 )
                {
                    break;
                }
            }
        }
        // 进度条
        private void startProgress()
        {
            // 显示进度条控件.
            progressBar1.Visible = true;
            // 设置进度条最小值.
            progressBar1.Minimum = 1;
            // 设置进度条最大值.
            progressBar1.Maximum = 15;
            // 设置进度条初始值
            progressBar1.Value = 1;
            // 设置每次增加的步长
            progressBar1.Step = 1;
            // 循环执行
            int x = 0;
            while (x 
                if (stop == true)
                {
                    progressBar1.Value = 15;
                    thread2.Abort();
                    break;
                }
                // 每次循环让程序休眠300毫秒
                System.Threading.Thread.Sleep(300);
                // 执行PerformStep()函数
                progressBar1.PerformStep();
                if (x == 15)
                {
                    x = 0;
                    progressBar1.Value = 1;
                    progressBar1.Step = 1;
                }
                x++;
            }
        }
    }
}
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]