今天忽然想起很久以前简单的模仿了一个, 呵呵(第一次 看到 Flashget 的多任务进度条工具时, 很是欣赏)
先放一个效果图
从图上可以看到有两个任务在运行, 各图示的解释:
灰色:还没开始执行的 cell
红色:正在执行的 cell
绿色:执行成功的 cell
黄色:执行出错的 cell
控件使用很简单, 大家看看注释应该就明白了
///
<summary>
///
普通项目的颜色
///
</summary>
[Description(
"
普通项目的颜色
"
), DefaultValue(
typeof
(Color),
"
Gray
"
)]
public
Color NormalColor
///
<summary>
///
进行中的项目颜色
///
</summary>
[Description(
"
进行中的项目颜色
"
), DefaultValue(
typeof
(Color),
"
Red
"
)]
public
Color ProcessingColor
///
<summary>
///
成功项目的颜色
///
</summary>
[Description(
"
已成功完成项目的颜色
"
), DefaultValue(
typeof
(Color),
"
Green
"
)]
public
Color CompleteColor
///
<summary>
///
错误项目的颜色
///
</summary>
[Description(
"
错误项目的颜色
"
), DefaultValue(
typeof
(Color),
"
Yellow
"
)]
public
Color ErrorColor
///
<summary>
///
每一个任务包含的块数
///
</summary>
[Browsable(
false
)]
public
List
<
int
>
Tasks
//
方法就一个
///
<summary>
///
设置 Cell 的状态
///
</summary>
///
<param name="task">
任务索引
</param>
///
<param name="block">
任务的块索引
</param>
///
<param name="state">
状态
</param>
public
void
SetBlockState(
int
task,
int
block, TaskState state)
再贴一段测试代码(执行后就是上图中中的效果):
private
void
button1_Click(
object
sender, EventArgs e)
{
//
开启两个线程, 模仿两个任务
new
Thread(ThreadRun1).Start();
new
Thread(ThreadRun2).Start();
}
//
第一个任务
int
thread1Index;
///
<summary>
///
任务开始
///
</summary>
void
Thread1Start()
{
MultiProgress.SetBlockState(
0
, thread1Index, HW.Windows.Forms.TaskState.PROCESSING);
}
///
<summary>
///
任务完成
///
</summary>
void
Thread1Complete()
{
if
(thread1Index
%
4
==
0
)
MultiProgress.SetBlockState(
0
, thread1Index
++
, HW.Windows.Forms.TaskState.ERROR);
else
MultiProgress.SetBlockState(
0
, thread1Index
++
, HW.Windows.Forms.TaskState.COMPLETE);
}
void
ThreadRun1()
{
for
(
int
i
=
0
; i
<
MultiProgress.Tasks[
0
]; i
++
)
{
Invoke(
new
MethodInvoker(Thread1Start));
//
处理耗时的操作
//
Thread.Sleep(
300
);
//
设置状态
Invoke(
new
MethodInvoker(Thread1Complete));
}
}
//
第二个任务, 代码和第一个一样。。。
int
thread2Index;
void
Thread2Start()
{
MultiProgress.SetBlockState(
1
, thread2Index, HW.Windows.Forms.TaskState.PROCESSING);
}
void
Thread2Complete()
{
if
(thread2Index
%
4
==
0
)
MultiProgress.SetBlockState(
1
, thread2Index
++
, HW.Windows.Forms.TaskState.ERROR);
else
MultiProgress.SetBlockState(
1
, thread2Index
++
, HW.Windows.Forms.TaskState.COMPLETE);
}
void
ThreadRun2()
{
for
(
int
i
=
0
; i
<
MultiProgress.Tasks[
1
]; i
++
)
{
Invoke(
new
MethodInvoker(Thread2Start));
//
处理耗时的操作
//
Thread.Sleep(
200
);
//
设置状态
Invoke(
new
MethodInvoker(Thread2Complete));
}
}
///
<summary>
///
设置两个任务, 第一个有30个块, 第二个有50个块
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
private
void
Form1_Load(
object
sender, EventArgs e)
{
MultiProgress.Tasks
=
new
List
<
int
>
(
new
int
[] {
30
,
50
});
}
控件下载
private void button1_Click(object sender, EventArgs e)
{
//开启两个线程, 模仿两个任务
new Thread(ThreadRun1).Start();
new Thread(ThreadRun2).Start();
}
//第一个任务
int thread1Index;
/// <summary>
/// 任务开始
/// </summary>
void Thread1Start()
{
MultiProgress.SetBlockState(0, thread1Index, HW.Windows.Forms.TaskState.PROCESSING);
}
/// <summary>
/// 任务完成
/// </summary>
void Thread1Complete()
{
if (thread1Index % 4 == 0)
MultiProgress.SetBlockState(0, thread1Index++, HW.Windows.Forms.TaskState.ERROR);
else
MultiProgress.SetBlockState(0, thread1Index++, HW.Windows.Forms.TaskState.COMPLETE);
}
void ThreadRun1()
{
for (int i = 0; i < MultiProgress.Tasks[0]; i++)
{
Invoke(new MethodInvoker(Thread1Start));
//处理耗时的操作
//
Thread.Sleep(300);
//设置状态
Invoke(new MethodInvoker(Thread1Complete));
}
}
//第二个任务, 代码和第一个一样。。。
int thread2Index;
void Thread2Start()
{
MultiProgress.SetBlockState(1, thread2Index, HW.Windows.Forms.TaskState.PROCESSING);
}
void Thread2Complete()
{
if (thread2Index % 4 == 0)
MultiProgress.SetBlockState(1, thread2Index++, HW.Windows.Forms.TaskState.ERROR);
else
MultiProgress.SetBlockState(1, thread2Index++, HW.Windows.Forms.TaskState.COMPLETE);
}
void ThreadRun2()
{
for (int i = 0; i < MultiProgress.Tasks[1]; i++)
{
Invoke(new MethodInvoker(Thread2Start));
//处理耗时的操作
//
Thread.Sleep(200);
//设置状态
Invoke(new MethodInvoker(Thread2Complete));
}
}
/// <summary>
/// 设置两个任务, 第一个有30个块, 第二个有50个块
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
MultiProgress.Tasks = new List<int>(new int[] { 30, 50 });
}