仿 flashget 的多任务进度条控件

本文介绍了一款自定义的多任务进度条控件,该控件能够显示多个任务的执行状态,包括未开始、正在进行、已完成和出错的任务。通过设置不同状态的颜色和调用简单的方法即可更新任务状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天忽然想起很久以前简单的模仿了一个, 呵呵(第一次 看到 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[] { 3050 });
        }

转载于:https://www.cnblogs.com/michaelhuwei/archive/2008/07/31/1257282.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值