C# 多线程方法 控制两个进度条

C#多线程方法控制两个进度条悬赏分:15-离问题结束还有14天23小时C#里面有两个标签(TabPage1,TabPage2),每个标签里面有一个进度条,一个开始按钮。点... C# 多线程方法 控制两个进度条
悬赏分:15 - 离问题结束还有 14 天 23 小时
C#里面有两个标签(TabPage1, TabPage2),每个标签里面有一个进度条,一个开始按钮。
点击第一个标签的开始,进度条就开始变动,具体数值通过代码动态控制,有时候快,有时候慢,但都是0到100的数值。
在第一个标签进度条运行的同时,第二个标签的按钮同样可以执行相同的操作。即,两个标签的进度条互不干涉。在进度条运行的同时,可以任意切换标签。
问题是,怎样实现,我需要思路和方法,多于代码拷贝和网址。
展开
 我来答
超人影视娱乐
高粉答主

推荐于2016-04-18 · 闲来无事的影评人-关注我把
超人影视娱乐
采纳数:7757 获赞数:60597

向TA提问 私信TA
展开全部
using System;  
using System.Collections.Generic;  
using System.ComponentModel;  
using System.Data;  
using System.Drawing;  
using System.Linq;  
using System.Text;  
using System.Windows.Forms;  
using System.Threading;  
  
namespace Demo0004  
{  
    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">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="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"></param>  
        /// <param name="e"></param>  
        void method_threadEndEvent(object sender, EventArgs e)  
        {  
            MessageBox.Show("执行已经完成!");  
        }  
  
        /// <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;  
        }  
    }  
  
  
    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());//通知主界面我已经完成了  
        }  
    }
zhaoweiting69
2010-05-26 · 超过17用户采纳过TA的回答
知道答主
回答量:82
采纳率:0%
帮助的人:0
展开全部

你是两个标签页

通过不同的线程来控制这两个进度条

互不干扰

如果是winform的可以用backgroundworker来实现

或者用thread

现在不明白你遇到了什么问题

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友c62a14344
2010-05-26 · TA获得超过832个赞
知道小有建树答主
回答量:317
采纳率:0%
帮助的人:338万
展开全部
最重要的是要实现异步。
其实就是你的代码逻辑与界面呈现,异步来做。互不干涉。
用多线程吧。
开条线程,执行你的代码,没执行一次,就触发个事件。
界面就订阅这个事件。每收到一次事件就更新一下进度条。

异步的处理。
如果是 WinForm ,那就 this.BeginInvoke(.......
如果是 WPF,就 this.Dispacher.BeginInvoke(....
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
kele629
2010-05-28 · 超过10用户采纳过TA的回答
知道答主
回答量:58
采纳率:0%
帮助的人:23.8万
展开全部
开2个线程,每个线程控制一个进度条。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
鱼日木水
2010-05-28
知道答主
回答量:21
采纳率:100%
帮助的人:19.4万
展开全部
Magicalsoft说的不错,再就是你这个问题问得并不是太清楚,大家回答的不会太具体
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式