• (转贴)关于多线程执行显示进度条的实例!


    关于多线程执行显示进度条的实例!
    之前回答了一篇关于怎么在线程中操作进度条的帖子,估计有人看的不是很明白
    今天没事,写了一个小小的实例,很简单,就2个文件
    权当抛砖引玉,希望有更好解决方案的人发表一下意见

    界面上2个控件,一个按钮和一个进度条
    using System;
    using System.Threading;
    using System.Windows.Forms;

    namespace WindowsFormsApplication2
    {
        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"></param>
            /// <param name="e"></param>
            void method_threadEndEvent(object sender, EventArgs e)
            {
                MessageBox.Show("我完成啦!");
            }

            /// <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">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="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;
            }
        }
    }

    另外一个文件

    using System;
    using System.Threading;

    namespace WindowsFormsApplication2
    {
        /// <summary>
        /// 线程处理方法
        /// </summary>
        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());//通知主界面我已经完成了
            }
        }
    }

    例子代码

    https://files.cnblogs.com/panzhilei/WindowsFormsApplication6.rar

  • 相关阅读:
    eclipse export runnable jar(导出可执行jar包) runnable jar可以执行的
    mave常用指令
    771. Jewels and Stones珠宝数组和石头数组中的字母对应
    624. Maximum Distance in Arrays二重数组中的最大差值距离
    724. Find Pivot Index 找到中轴下标
    605. Can Place Flowers零一间隔种花
    581. Shortest Unsorted Continuous Subarray连续数组中的递增异常情况
    747. Largest Number At Least Twice of Others比所有数字都大两倍的最大数
    643. Maximum Average Subarray I 最大子数组的平均值
    414. Third Maximum Number数组中第三大的数字
  • 原文地址:https://www.cnblogs.com/panzhilei/p/1874039.html
Copyright © 2020-2023  润新知