博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程执行显示进度条的实例
阅读量:4318 次
发布时间:2019-06-06

本文共 4177 字,大约阅读时间需要 13 分钟。

前几天刚用过,修改了一下,参考了一位前辈的例子
http://blog.mylover.cn/2009/02/post-3.html
C# code
 
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.Text;
using
System.Windows.Forms;
using
System.Threading;
namespace
TestProgressBar {
public
partial
class
TestForm : Form {
//
线程开始的时候调用的委托
private
delegate
void
maxValueDelegate(WordEventArgs e);
//
线程执行中调用的委托
private
delegate
void
nowValueDelegate(WordEventArgs e);
//
线程执行结束调用的委托
private
delegate
void
endValueDelegate(WordEventArgs e);
public
TestForm() { InitializeComponent(); }
private
void
btn_Test_Click(
object
sender, EventArgs e) { Worker worker
=
new
Worker();
///
订阅事件
worker.OnStartWorkEvent
+=
new
WorkEventHandler(
this
.OnStartWorkEventHandler); worker.OnDoWorkEvent
+=
new
WorkEventHandler(
this
.OnDoWorkEventHandler); worker.OnEndWorkEvent
+=
new
WorkEventHandler(
this
.OnEndWorkEventHandler); Thread thread
=
new
Thread(
new
ThreadStart(worker.Work)); thread.Start(); }
///
<summary>
///
线程开始事件,设置进度条最大值,需要一个委托来替我完成
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
void
OnStartWorkEventHandler(
object
sender, WordEventArgs e) { maxValueDelegate max
=
new
maxValueDelegate(SetMaxValue);
this
.Invoke(max, e); }
///
<summary>
///
线程执行中的事件,设置进度条当前进度,需要一个委托来替我完成
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
void
OnDoWorkEventHandler(
object
sender, WordEventArgs e) { nowValueDelegate now
=
new
nowValueDelegate(SetNowValue);
this
.Invoke(now, e); }
///
<summary>
///
线程完成事件
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
void
OnEndWorkEventHandler(
object
sender, WordEventArgs e) { endValueDelegate end
=
new
endValueDelegate(SetEndValue);
this
.Invoke(end, e); }
///
<summary>
///
被委托调用,专门设置进度条最大值的
///
</summary>
///
<param name="maxValue"></param>
private
void
SetMaxValue(WordEventArgs e) {
this
.probar_Test.Maximum
=
e.Position; lbl_Info.Text
=
e.Info; }
///
<summary>
///
被委托调用,专门设置进度条当前值的
///
</summary>
///
<param name="nowValue"></param>
private
void
SetNowValue(WordEventArgs e) {
this
.probar_Test.Value
=
e.Position; lbl_Info.Text
=
e.Info; }
///
<summary>
///
被委托调用,专门设置进度条结束后的处理
///
</summary>
///
<param name="nowValue"></param>
private
void
SetEndValue(WordEventArgs e) {
this
.probar_Test.Value
=
e.Position; ; lbl_Info.Text
=
e.Info; MessageBox.Show(e.Info); } } }
C# code
 
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Threading;
namespace
TestProgressBar {
public
delegate
void
WorkEventHandler(
object
sender, WordEventArgs e);
class
Worker {
///
<summary>
///
开始事件
///
</summary>
public
event
WorkEventHandler OnStartWorkEvent;
///
<summary>
///
执行时事件
///
</summary>
public
event
WorkEventHandler OnDoWorkEvent;
///
<summary>
///
结束事件
///
</summary>
public
event
WorkEventHandler OnEndWorkEvent;
public
Worker() { }
private
void
SendEvents(WordEventArgs e) {
switch
(e.Stage) {
case
WorkStage.BeginWork:
if
(OnStartWorkEvent
!=
null
) OnStartWorkEvent(
this
, e);
break
;
case
WorkStage.DoWork:
if
(OnDoWorkEvent
!=
null
) OnDoWorkEvent(
this
, e);
break
;
case
WorkStage.EndWork:
if
(OnEndWorkEvent
!=
null
) OnEndWorkEvent(
this
, e);
break
;
default
:
if
(OnDoWorkEvent
!=
null
) OnDoWorkEvent(
this
, e);
break
; } }
public
void
Work() {
int
iTotal
=
100
;
//
计算工作量,这里是设置为100,如果是上传,或者下载,就是文件的大小,循环遍历的话,这就是最大的那个循环数
SendEvents(
new
WordEventArgs(WorkStage.BeginWork,
"
开始工作!
"
, iTotal));
int
iCount
=
0
;
for
(
int
i
=
0
; i
<
iTotal; i
++
) { Thread.Sleep(
50
);
//
休息50毫秒,模拟执行大数据量操作,
iCount
=
i;
//
此处计算所处的位置,如果是上传或者下载了多少了,
SendEvents(
new
WordEventArgs(WorkStage.DoWork,
"
正在工作ing
"
+
iCount.ToString(), iCount)); } SendEvents(
new
WordEventArgs(WorkStage.EndWork,
"
结束工作!
"
, iTotal)); } }
class
WordEventArgs : EventArgs {
//
主要是用来往外传递信息的
public
WorkStage Stage;
public
string
Info
=
""
;
public
int
Position
=
0
;
public
WordEventArgs(WorkStage Stage,
string
Info,
int
Position) {
this
.Stage
=
Stage;
this
.Info
=
Info;
this
.Position
=
Position; } }
public
enum
WorkStage { BeginWork,
//
准备工作
DoWork,
//
正在工作
EndWork,
//
工作结束
} }

转载于:https://www.cnblogs.com/l1b2q31/articles/2186256.html

你可能感兴趣的文章
CKplayer:视频推荐和分享插件设置
查看>>
CentOS系统将UTC时间修改为CST时间
查看>>
redis常见面试题
查看>>
导航控制器的出栈
查看>>
玩转CSS3,嗨翻WEB前端,CSS3伪类元素详解/深入浅出[原创][5+3时代]
查看>>
iOS 9音频应用播放音频之播放控制暂停停止前进后退的设置
查看>>
Delphi消息小记
查看>>
HNOI2016
查看>>
JVM介绍
查看>>
将PHP数组输出为HTML表格
查看>>
Java中的线程Thread方法之---suspend()和resume() 分类: ...
查看>>
经典排序算法回顾:选择排序,快速排序
查看>>
BZOJ2213 [Poi2011]Difference 【乱搞】
查看>>
c# 对加密的MP4文件进行解密
查看>>
AOP面向切面编程C#实例
查看>>
AngularJs学习笔记-慕课网AngularJS实战
查看>>
数据库三大范式
查看>>
工作总结之二:bug级别、优先级别、bug状态
查看>>
访问修饰符、封装、继承
查看>>
更换pip源到国内镜像,提升pip下载速度.
查看>>