zoukankan      html  css  js  c++  java
  • (转贴)关于多线程执行显示进度条的实例!

    关于多线程执行显示进度条的实例!
    之前回答了一篇关于怎么在线程中操作进度条的帖子,估计有人看的不是很明白
    今天没事,写了一个小小的实例,很简单,就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

  • 相关阅读:
    stringstream用法
    C# WinForm设置窗口无边框、窗口可移动、窗口显示在屏幕中央、控件去边框
    C# WinForm设置窗口大小不可调,取消最大、最小化按键
    LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal 由前序和中序遍历建立二叉树 C++
    LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal 由中序和后序遍历建立二叉树 C++
    LeetCode 112. Path Sum 二叉树的路径和 C++
    LeetCode 101. Symmetric Tree 判断对称树 C++
    LeetCode 100. Same Tree 判断两棵二叉树是否相等 C++
    C# winform三种方法判断文本框textBox内容是否为空
    LeetCode 145. Binary Tree Postorder Traversal 二叉树的后序遍历 C++
  • 原文地址:https://www.cnblogs.com/panzhilei/p/1874039.html
Copyright © 2011-2022 走看看