Muestra una barra de progreso con TimeProgressBar

El TimeProgressBar te permite mostrar el progreso de una tarea cuando se conoce su tiempo de funcionamiento. Si bien, el control del ProgressBar se puede utilizar para esta tarea, quería un control que mostrará más información sobre el progreso de la tarea, como el tiempo transcurrido desde el inicio de la tarea, el tiempo que queda hasta el final de la tarea y el porcentaje del tiempo pasado desde el inicio de la ejecución de la tarea.

Cómo implementarlo

El control muestra una barra de progreso. Esta barra coloreada con TimeMainColor, representa el tiempo total de la tarea que se está ejecutando. El progreso se indica mediante un rectángulo que se colorea con TimePassColor. Este rectángulo se solapa con la barra de progreso y se situa en su lado izquierdo. El tamaño de este rectángulo estará determinado por el porcentaje de tiempo transcurrido desde el tiempo total de la tarea (es decir: si el 60% de la tarea ha pasado, la anchura del rectángulo será el 60% de la anchura del rectángulo principal).

El control también muestra tres detalles sobre el progreso de la tarea:

  • En el lado izquierdo, el tiempo transcurrido desde el inicio de la tarea
  • En el centro, el porcentaje de tiempo transcurrido desde el tiempo total de la tarea
  • En la derecha, el tiempo que queda hasta el final de la tarea

La propiedad TimeInside determina dónde se mostrarán estos detalles. Si es true, los tiempos se mostrarán dentro de la barra de progreso. De lo contrario, se mostrarán los tiempos fuera de la barra de progreso.

Empezando el desarrollo

Para comenzar a supervisar el progreso de una nueva tarea, utilza uno de los métodos Start.

  • El Start (duración del TimeSpan) supervisará el progreso del tiempo de la tarea desde el momento de su ejecución hasta que haya pasado el tiempo de duración.
  • El Start (DateTime startTime, DateTime endTime) mostrará el progreso de una tarea que se inicia en startTime y termina en endTime.

Para mostrar el progreso de la tarea y actualizar las propiedades de control (TimeLeft, TimeLeftPercent, timepass, TimePassPercent), debe llamarse a el método Update. El control lo llamará cada segundo si AutoUpdate es true. De lo contrario, el usuario será el responsable de actualizar el contol.

Eventos

Los siguientes eventos serán invocados por el control:

  • El evento OnStart se invoca cuando se ha iniciado la tarea.
  • El evento OnTick se invoca cuando la tarea no ha terminado aún y el control se ha actualizado. Si AutoUpdate es true, este evento será invocado a cada segundo.
  • El evento OnEnd se invoca cuando la tarea ha terminado.

El código

Demo Autoupdate

Esta demo muestra cómo utilizar el control con los valores por defecto (AutoUpdate es true). Cuando se carga el formulario, conectaremos los controladores de los eventos y estableceremos el tiempo de trabajo a 20 segundos:

//-------------------------------------------------------------------------
protected override void OnLoad(EventArgs e) {
  base.OnLoad(e);
  winTimeProgresBar.OnStart += new EventHandler(this.winTimeProgresBar_OnStart);
  winTimeProgresBar.OnTick  += new EventHandler(this.winTimeProgresBar_OnTick);
  winTimeProgresBar.OnEnd   += new EventHandler(this.winTimeProgresBar_OnEnd);
  winTimeProgresBar.Start(new TimeSpan(0,0,20));
} 

Los handlers mostrarán el mensaje sobre el evento. Ten en cuenta que Invoke se utiliza como los handlers por lo que no serán llamados en el hilo GUI.

//-------------------------------------------------------------------------
private void winTimeProgresBar_OnStart(object sender,EventArgs e) {
  Invoke(new AppendTextProc(AppendText),"OnStart");
}
//-------------------------------------------------------------------------
private void winTimeProgresBar_OnEnd(object sender,EventArgs e) {
  Invoke(new AppendTextProc(AppendText), "OnEnd");
}
//-------------------------------------------------------------------------
private void winTimeProgresBar_OnTick(object sender,EventArgs e) {
  Invoke(new AppendTextProc(AppendText),"OnTick");
}
//-------------------------------------------------------------------------
private delegate void AppendTextProc(string msg);
private void AppendText(string prefix) {
  string ss = string.Format("{0,-8} : {1:D2}%rn",prefix,winTimeProgresBar.TimePassPercent);
  winText.AppendText(ss);
}
//------------------------------------------------------------------------- 

Demo NoAutoUpdate

//-------------------------------------------------------------------------
protected override void OnLoad(EventArgs e) {
  base.OnLoad(e);
  winTimeProgresBar.OnStart += new System.EventHandler(this.winTimeProgresBar_OnStart);
  winTimeProgresBar.OnTick  += new System.EventHandler(this.winTimeProgresBar_OnTick);
  winTimeProgresBar.OnEnd   += new System.EventHandler(this.winTimeProgresBar_OnEnd);
  winTimeProgresBar.AutoUpdate = false;
  winTimeProgresBar.Start(new TimeSpan(0,0,20));
}   

Los handlers mostrarán el mensaje sobre el evento. El handler OnStart creará el temporizador. El temporizador destruirá el handler OnEnd.

//-------------------------------------------------------------------------
private void winTimeProgresBar_OnStart(object sender,EventArgs e) {
  Invoke(new AppendTextProc(AppendText),"OnStart");
  _timer = new System.Threading.Timer(
    _ => winTimeProgresBar.Update() , null, new TimeSpan(),new TimeSpan(0,0,1)
  );
}
//-------------------------------------------------------------------------
private void winTimeProgresBar_OnEnd(object sender,EventArgs e) {
  Invoke(new AppendTextProc(AppendText), "OnEnd");
  _timer.Dispose();
}
//-------------------------------------------------------------------------
private void winTimeProgresBar_OnTick(object sender,EventArgs e) 
  Invoke(new AppendTextProc(AppendText),"OnTick");
}
//-------------------------------------------------------------------------
private delegate void AppendTextProc(string msg);
private void AppendText(string prefix) {
  string ss = string.Format("{0,-8} : {1:D2}%rn",prefix,winTimeProgresBar.TimePassPercent);
  winText.AppendText(ss);
}
//-------------------------------------------------------------------------   

Y este ha sido el tutorial sobre cómo mostrar una barra de progreso con TimeProgressBar, esperamos que te haya gustado y sepas aplicarlo en tus futuros proyectos. Ya sabes que si nos quieres proponer un tema que quieres ver reflejado como un tutorial o como una práctica, solo tienes que hacer uso del área de comentarios de un poco más abajo. Por el contrario, si quieres enviarnos tus propios tutoriales, puedes hacerlo a través de la intranet de usuarios que está habilitada para ello, a través del menú Enviar Tutorial. Ya sabes, ayúdanos a crecer con tus conocimientos. ¡Un saludo y feliz código!

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP