C# 多线程方法 控制两个进度条
C#多线程方法控制两个进度条悬赏分:15-离问题结束还有14天23小时C#里面有两个标签(TabPage1,TabPage2),每个标签里面有一个进度条,一个开始按钮。点...
C# 多线程方法 控制两个进度条
悬赏分:15 - 离问题结束还有 14 天 23 小时
C#里面有两个标签(TabPage1, TabPage2),每个标签里面有一个进度条,一个开始按钮。
点击第一个标签的开始,进度条就开始变动,具体数值通过代码动态控制,有时候快,有时候慢,但都是0到100的数值。
在第一个标签进度条运行的同时,第二个标签的按钮同样可以执行相同的操作。即,两个标签的进度条互不干涉。在进度条运行的同时,可以任意切换标签。
问题是,怎样实现,我需要思路和方法,多于代码拷贝和网址。 展开
悬赏分:15 - 离问题结束还有 14 天 23 小时
C#里面有两个标签(TabPage1, TabPage2),每个标签里面有一个进度条,一个开始按钮。
点击第一个标签的开始,进度条就开始变动,具体数值通过代码动态控制,有时候快,有时候慢,但都是0到100的数值。
在第一个标签进度条运行的同时,第二个标签的按钮同样可以执行相同的操作。即,两个标签的进度条互不干涉。在进度条运行的同时,可以任意切换标签。
问题是,怎样实现,我需要思路和方法,多于代码拷贝和网址。 展开
展开全部
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());//通知主界面我已经完成了
}
}
展开全部
最重要的是要实现异步。
其实就是你的代码逻辑与界面呈现,异步来做。互不干涉。
用多线程吧。
开条线程,执行你的代码,没执行一次,就触发个事件。
界面就订阅这个事件。每收到一次事件就更新一下进度条。
异步的处理。
如果是 WinForm ,那就 this.BeginInvoke(.......
如果是 WPF,就 this.Dispacher.BeginInvoke(....
其实就是你的代码逻辑与界面呈现,异步来做。互不干涉。
用多线程吧。
开条线程,执行你的代码,没执行一次,就触发个事件。
界面就订阅这个事件。每收到一次事件就更新一下进度条。
异步的处理。
如果是 WinForm ,那就 this.BeginInvoke(.......
如果是 WPF,就 this.Dispacher.BeginInvoke(....
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
开2个线程,每个线程控制一个进度条。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Magicalsoft说的不错,再就是你这个问题问得并不是太清楚,大家回答的不会太具体
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询