仿 flashget 的多任务进度条控件
今天忽然想起很久以前简单的模仿了一个, 呵呵(第一次 看到 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 });
}
转载于:https://www.cnblogs.com/michaelhuwei/archive/2008/07/31/1257282.html