委托+线程实现超简单winform实时进度条 欢迎拍砖

xboxeer 2012-06-29 10:12:39
一直搞ASP.NET没多少机会碰一碰多线程 这几天自己鼓捣了个实时更新的winform进度条控件(不是假的那种哦!) 使用者无需知道线程等相关知识 甚至连委托都不怎么需要知道 即可实现一个支持开始 暂停 继续 终止 再次开始的进度条效果
以下是调用方法

private void Start_Click(object sender, EventArgs e)
{
this.myProcessBar1.Task = this.Task;
this.myProcessBar1.Run();//开始工作线程 同时开始监听工作进度
}
//某个耗时操作 参数即当前进度
public void Task(ref float percentage)
{
int i = 0;
while (i < int.MaxValue )
{
i++;
percentage = i / (float)int.MaxValue;
}
}

private void button1_Click(object sender, EventArgs e)
{
this.myProcessBar1.Stop();//暂停进度条 同时也暂停工作线程
}

private void button2_Click(object sender, EventArgs e)
{
this.myProcessBar1.Resume();//继续进度条 同时继续工作线程
}

private void button3_Click(object sender, EventArgs e)
{
this.myProcessBar1.Abort();//终止工作进程
}

private void button4_Click(object sender, EventArgs e)
{
this.myProcessBar1.Run();//这边位重新启动进度条
}

效果图如下

整体思路是用三个线程 即UI线程本身 工作线程 以及监听线程 监听线程实时获取工作线程的执行的情况 并负责更新UI 这里面有一个很大的问题就是如何实时获取工作线程的进度情况 这里就提出一种没有被验证是否可靠的但是现在来说算是可行的方案 即引用类型参数

由于引用类型参数在传值的时候传递的是本身 因此所有针对他的变化都可以被外部获取 但是为了保证该变量的安全 设计的时候将该变量作为控件 的私有字段 并对外开放只读属性 这样就保证了该变量不会被非工作线程所改变
源代码下载链接
...全文
1022 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
lixan8672 2012-07-01
  • 打赏
  • 举报
回复
学习一下原理方法,也不错。感谢楼主的分享
yuandonghuia 2012-07-01
  • 打赏
  • 举报
回复
backgroundworker,微软已经给你弄好了.
myceolzy 2012-06-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

囧 没人么~自己顶一下~
[/Quote]
jdc71264 2012-06-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

囧 没人么~自己顶一下~
[/Quote]
会心一顶
xboxeer 2012-06-30
  • 打赏
  • 举报
回复
囧 没人么~自己顶一下~
无名小猿 2012-06-30
  • 打赏
  • 举报
回复
很不错,
xboxeer 2012-06-30
  • 打赏
  • 举报
回复
恩 代码内部就是这么做的 我无非是封装了一下供有需要的人方便使用
[Quote=引用 13 楼 的回复:]
Thread+Invoke
也能达到这个效果
[/Quote]
KGallery 2012-06-30
  • 打赏
  • 举报
回复
Thread+Invoke
也能达到这个效果
xboxeer 2012-06-30
  • 打赏
  • 举报
回复
好吧~~审美不行~~~不过留了个虚方法 可以继承重写Draw方法~~~~~
[Quote=引用 11 楼 的回复:]
你那白白的进度条几乎和背景融为一体。。我以为只有一根黑色的棒子。。。
[/Quote]
Conmajia 2012-06-30
  • 打赏
  • 举报
回复
你那白白的进度条几乎和背景融为一体。。我以为只有一根黑色的棒子。。。
theks 2012-06-30
  • 打赏
  • 举报
回复
backgroundworker,简单好用。
xboxeer 2012-06-30
  • 打赏
  • 举报
回复
额 什么错误?内部全部做了判断的
[Quote=引用 8 楼 的回复:]
大哥线程状态也做一下判断啊。铛铛的错误...
[/Quote]
Change_L 2012-06-30
  • 打赏
  • 举报
回复
大哥线程状态也做一下判断啊。铛铛的错误...
  • 打赏
  • 举报
回复
顶、以后会用到吧、谢谢LZ
caoqinghua 2012-06-30
  • 打赏
  • 举报
回复
谢谢分享.

111,013

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧