| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 13698 人关注过本帖, 6 人收藏
标题:关于多线程执行显示进度条的实例!
只看楼主 加入收藏
shmilylee
Rank: 2
来 自:江苏扬州蹩脚小公司
等 级:论坛游民
威 望:2
帖 子:242
专家分:22
注 册:2007-7-6
收藏(6)
 问题点数:0 回复次数:19 
关于多线程执行显示进度条的实例!
之前回答了一篇关于怎么在线程中操作进度条的帖子,估计有人看的不是很明白
今天没事,写了一个小小的实例,很简单,就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());//通知主界面我已经完成了
        }
    }
}


注:可以下载项目文件,项目是VS2008写的(我机器上只有2008),没有装的朋友可以把代码复制到其他版本的IDE

[[it] 本帖最后由 shmilylee 于 2008-10-12 11:21 编辑 [/it]]

WindowsFormsApplication2.rar (39.15 KB)
收到的鲜花
  • 小仙2008-10-13 14:56 送鲜花  20朵   附言:好帖~
搜索更多相关主题的帖子: 线程 实例 进度 
2008-10-12 11:17
kinview
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2008-10-12
收藏
得分:0 
这个论坛不错,终于找到了,学习
2008-10-12 23:47
seiya027848
Rank: 1
等 级:新手上路
帖 子:60
专家分:0
注 册:2008-6-27
收藏
得分:0 
为什么不能直接使用进度条,而要用委托?
2008-10-13 09:59
myemail1983
Rank: 2
来 自:南京
等 级:新手上路
威 望:3
帖 子:256
专家分:0
注 册:2008-7-27
收藏
得分:0 
不错,有时间看下

寻找学习的动力,承接小型程序设计,呵呵,为了激励自己学习下。
虽然做不到无私,但会学着去帮助别人
2008-10-13 13:17
shmilylee
Rank: 2
来 自:江苏扬州蹩脚小公司
等 级:论坛游民
威 望:2
帖 子:242
专家分:22
注 册:2007-7-6
收藏
得分:0 
控件不能被多个线程同时操作,这样会引起混乱,它会不知道要听谁的了,微软的说法叫不安全的线程
如果要在非创建控件的线程中操作控件,那就要委托给创建控件的线程去操作,这样才是安全的线程
虽然有办法可以直接操作,但是那样会留下隐患,很有可能出错!
2008-10-13 14:21
meerio
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2008-11-18
收藏
得分:0 
在多次点击按钮时,会出来多个线程同时操作进度条问题,如何解决?
2008-11-18 16:41
shmilylee
Rank: 2
来 自:江苏扬州蹩脚小公司
等 级:论坛游民
威 望:2
帖 子:242
专家分:22
注 册:2007-7-6
收藏
得分:0 
将线程定义写在方法外面,作为类的属性
点击按钮的时候判断线程当前状态


太可恶了,居然不能超过100个字符!
这区区100个又怎么能概括我平凡而又伟大的一生!
2008-11-19 10:21
xuehu0072002
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2008-11-6
收藏
得分:0 
不得不说 楼主写的很不错
2008-11-30 08:03
meisbrother
Rank: 2
等 级:论坛游民
帖 子:100
专家分:29
注 册:2007-5-11
收藏
得分:0 
刚学c#,有例子就要看一下
2008-11-30 11:16
TianQi
Rank: 1
等 级:新手上路
帖 子:40
专家分:0
注 册:2008-12-5
收藏
得分:0 
已经下载学习,谢谢共享。
2009-08-04 17:07
快速回复:关于多线程执行显示进度条的实例!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019902 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved