C# 多线程方法 控制两个进度条
发布网友
发布时间:2022-04-27 08:13
我来回答
共5个回答
热心网友
时间:2022-04-27 09:42
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());//通知主界面我已经完成了
}
}
热心网友
时间:2022-04-27 11:00
你是两个标签页
通过不同的线程来控制这两个进度条
互不干扰
如果是winform的可以用backgroundworker来实现
或者用thread
现在不明白你遇到了什么问题
热心网友
时间:2022-04-27 12:35
最重要的是要实现异步。
其实就是你的代码逻辑与界面呈现,异步来做。互不干涉。
用多线程吧。
开条线程,执行你的代码,没执行一次,就触发个事件。
界面就订阅这个事件。每收到一次事件就更新一下进度条。
异步的处理。
如果是 WinForm ,那就 this.BeginInvoke(.......
如果是 WPF,就 this.Dispacher.BeginInvoke(....
热心网友
时间:2022-04-27 14:26
开2个线程,每个线程控制一个进度条。
热心网友
时间:2022-04-27 16:34
Magicalsoft说的不错,再就是你这个问题问得并不是太清楚,大家回答的不会太具体
c# 我做了2个进度条,1个是单个文件下载的进度,一个是总的下载进度,但是...
所以这个时候就要使用多线程(Thread)了,你这种情况,刷新进度条要单独一个线程,下载处理要单独一个线程,还有程序本身的进程,总共需要三个进程。给你个代码片段吧,关於多线程详细知识可以百度之。using System.Threading;……//线程定义,也可以这样://Thread th = new Thread(new ThreadStart(void...
...怎么才能使得在做两个for循环的时候,进度条一点一点的向前滚,而不...
这是因为你的for循环与gui线程是同一条,所以只有在执行完所有循环以后才会刷新processbar。解决方法是将循环放到另一个线程中,然后通过委托来更新processbar就可以了。
C#进度条怎么多线程使用
根据面向对象原则,value只是控制的一个属性,而刷新或重绘也控件一个方法。所以要相互配合才可以。当然正常的情况下,ProgressBar已经实现了一个具体成员方法,那就是PreformStep/Increment成员方法。设置ProgressBar的当前值(默认为最小值)和Step(每次步进值。然后每次调用PreformStep,则会将Value增加一个S...
c# 做数据加载时候的一个进度条
两个线程,一个线程读取数据,一个线程设置进度条进度。后者靠前者给的数据来知道当前到什么进度了,当然,两个线程之间肯定就要有通信,比如发送自定义消息。我说的这个办法适用于windows下所有的开发语言,无论c#还是vc++
c#实现两个进度条互相关联
就只是跑进度条,而不是和实际的某个进度相关吗?如果只是跑进度条,我给你代码。如果是进度条和其他进程相关,这个写起来太多了,只能给你个思路。所以,先说一下究竟是要哪种?
如何显示进度条
使用C#显示进度条,涉及到多线程编程,我只探索了使用BackgroundWorker和Thread的方法,下面分别列出。第一种:使用BackgroundWorker进行进度条控制 BackgroundWorker对象有三个主要的事件:DoWork - 当BackgroundWorker对象的多线程操作被执行时触发。RunWokerCompleted - 当BackgroundWoker对象的多线程操作完成...
C#Winform中,我在查询数据时等待时间过长,想用一个进度条显示机器正在...
首先正式查询数据之前先查询下一共有多少跳记录 count一下 这个速度应该很快的 声明一个变量 currentNum 来记录当前取到多少条数据 然后用datareader来读取数据,每读一条currentNum累加 当前进度为currentNum / 总条数 这样用这样进度条就可以实现了 当然要在界面上显示 肯定是要做多线程处理的 ...
c#应用程序的进度条控件怎么使用啊?
1把进度条控件从工具箱中拖出2用线程启动查询方法 如:progressBarValue = 0; progressBarVisible = true; new SystemThreadingThread(delegate() { while (progressBarValue + 10 < progressBarMaximum) { thisInvoke(func, progressBc#应用程序的进度条控件怎么使用啊?
C# 怎么保证两个任务同时完成或同时失败
如果是数据库可以用事务,程序的话就得直接写判断了
C#中为什么进度条不能执行完,也就是进度没到运行底
进度条的Paint过程是单独一个线程的,无论你的主线程如何处理都控制不了这个线程。你只能等系统处理完消息队列才能看到正常的效果。处理这个等待的过程有人用System.Threading.Thread.Sleep(1000)过程,加延时的思路是对的,但是技术不对症。我们的目地是让系统把消息队列处理完,而不是系统去睡觉!想让...