今天忽然想起很久以前简单的模仿了一个, 呵呵(第一次 看到 Flashget 的多任务进度条工具时, 很是欣赏)
先放一个效果图
从图上可以看到有两个任务在运行, 各图示的解释:
灰色:还没开始执行的 cell
红色:正在执行的 cell
绿色:执行成功的 cell
黄色:执行出错的 cell
控件使用很简单, 大家看看注释应该就明白了
/// 普通项目的颜色
/// </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 });
}