WPF - ProgressBar - Clase VO

Descripción general:

Clase VO que se usa para mover información desde el Task asíncrono al formulario principal durante el informe de progreso. Recibe, (a través del constructor) el numero de segundos que faltan para que termine el proceso y calcula en formato texto y formateado como tiempo, el tiempo que falta para que termine

La situación de ejemplo es la siguiente:

Suponemos un cronometro inverso, que cuente los segundos que faltan para que acabe un proceso. De esta forma podremos usar los segundos que faltan para actualizar la propiedad [value] del ProgressBar.

Esta clase es un objeto VO (Value Object) y se utiliza para mover la información desde el hilo al formulario y asi mover el ProgressBar


↑↑↑

Código VB


'   /** 
'   --------------------------------------------- 
'   [- (A) Contenido -] 
'   --------------------------------------------- 
'   [- Versión       -] = 23.09.16.1407. 
'   [- Nombre Clase  -] = DatosDevueltos. 
'   ------------- 
'   [- Descripción   -] = 
'      Clase VO que se usa para mover información desde el Task asíncrono 
'      al formulario principal durante el informe de progreso. 
'   ------------- 
'   [- Observaciones -] = 
'      Recibe, (a través del constructor) el numero de segundos que faltan 
'      para que termine el proceso  y calcula en formato texto y 
'      formateado como tiempo, el tiempo que falta para que termine 
' 
'      Ejemplo recibe 200 segundos y devuelve la cadena "03:20" 
' 
'       Esta clase forma parte de un proyecto de prueba para estudiar 
'       como se puede actualizar un control [ProgressBar] desde un Hilo 
'       usando las clases [Task] y [Progress] (Informes de progreso). 
'   ------------- 
'   [- CodigoEjemplo -] = 
'      ' informe de progreso 
'      If progress IsNot Nothing Then 
'          Dim objDatosVO As New DatosDevueltos(i) 
'          progress.Report(objDatosVO) 
'      End If 
'      -- 
'        Para el informe de progreso. 
'        Dim progress As New Progress(Of DatosDevueltos)(Sub(ByVal paramObjDatosVO As DatosDevueltos) 
'                                                  pbStatus.Value = paramObjDatosVO.NumeroDeSegundos 
'                                                  TextBoxCronometro.Text = paramObjDatosVO.TextoTiempoRestante 
'                                              End Sub). 
'   --------------------------------------------- 
'   [- (B) Información básica -] 
'   --------------------------------------------- 
'   [- Module Name   -] = DatosDevueltos.vb. 
'   [- Propietario   -] = AGUILA\Cuenta de Trabajo. 
'   [- Type          -] = vb/file. 
'   [- Size          -] = 4,83 KB - [4945 Bytes]. 
'   [- Lenguaje      -] = spa [es-ES] Español (España). 
'   ------------- 
'   [- Fecha de creación       -] = 2023-09-16T08:20:01. 
'   [- Último acceso           -] = 2023-09-16T14:07:28. 
'   [- Última modificación     -] = 2023-09-16T14:05:52. 
'   ------------- 
'   [- Net Framework Release   -] = Release: 4.6.1 o posterior. 
'   [- Net Framework Version   -] = Versión: 4.0.30319.42000. 
'   [- Generador nombre        -] = H_DocumentadorClases2022. 
'   [- Generador Version       -] = Versión: 1.2.3.4. 
'   --------------------------------------------- 
'   [- (C) Propiedad intelectual -] 
'   --------------------------------------------- 
'   [- Autor Nombre    -] = Joaquin Medina Serrano. 
'   [- Autor CorreoE   -] = gmjms32@gmail.com. 
'   [- Autor Copyright -] = 
'      Esta obra está bajo una Licencia Creative Commons Atribución-NoComercial-SinDerivar 4.0 Internacional. 
'      Se puede consultar una copia  de la licencia http://creativecommons.org/licenses/by-nc-nd/4.0/. 
'   --------------------------------------------- 
'   [- /Eof -] 
'   */ 

Option Explicit On 
Option Strict On 
Option Infer Off 
Option Compare Binary 

''' <summary> 
'''    Clase VO que se usa para mover información desde el Task asíncrono 
'''    al formulario principal durante el informe de progreso. 
''' </summary> 
''' <remarks> 
'''    <abstract> 
'''       <para> Recibe, (a través del constructor) el numero de segundos que faltan 
'''              para que termine el proceso  y calcula en formato texto y 
'''              formateado como tiempo, el tiempo que falta para que termine 
'''       </para> 
'''       <para> Ejemplo recibe 200 segundos y devuelve la cadena "03:20" </para> 
'''       <para> Esta clase forma parte de un proyecto de prueba para estudiar 
'''              como se puede actualizar un control [ProgressBar] desde un Hilo 
'''              usando las clases [Task] y [Progress] (Informes de progreso) 
'''       </para> 
'''    </abstract> 
'''    <example> 
'''       Un Ejemplo con la forma de uso de la clase 
'''       <code> 
'''          <![CDATA[ 
'''             ' informe de progreso 
'''               For i = 0 to 100 
'''                  If progress IsNot Nothing Then 
'''                      Dim objDatosVO As New DatosDevueltos(i) 
'''                      progress.Report(objDatosVO) 
'''                  End If 
'''              Next 
'''             -- 
'''               Para el informe de progreso. 
'''                  Dim progress As New Progress(Of DatosDevueltos) 
'''                            (Sub(ByVal paramObjDatosVO As DatosDevueltos) 
'''                                pbStatus.Value = paramObjDatosVO.NumeroDeSegundos 
'''                                TextBoxCronometro.Text = paramObjDatosVO.TextoTiempoRestante 
'''                            End Sub) 
'''          ]]> 
'''       </code> 
'''    </example> 
'''    <fechaCreacion> 
'''       2023-09-16T08:20:01 
'''    </fechaCreacion> 
''' </remarks> 
Public Class DatosDevueltos 

    ''' <summary> 
    ''' Representa el numero de segundo que faltan para que acabe el proceso 
    ''' Este valor se pasara a la propiedad [value] del control [ProgressBar] del formulario principal 
    ''' </summary> 
    Public ReadOnly Property NumeroDeSegundos As Integer 

    ''' <summary> 
    '''  Representa una cadena formateada como un instante de tiempo por ejemplo "03:20" [3 minutos y 20 segundos] 
    '''  este valor se representara en un TextBox en el formulario principal 
    ''' </summary> 
    ''' <returns></returns> 
    Public ReadOnly Property TextoTiempoRestante As String 

    ''' <summary> 
    ''' Constructor 
    ''' </summary> 
    ''' <param name = "paramNumeroDeSegundos">Numero de segundo que faltan para que acabe el proceso</param> 
    Public Sub New(ByVal paramNumeroDeSegundos As Integer) 
        NumeroDeSegundos = paramNumeroDeSegundos 
        TextoTiempoRestante = CalculoTextoCronometro(paramNumeroDeSegundos) 
    End Sub 

    ''' <summary> 
    '''    Esta función recibe un numero de segundos (en formato integer) 
    '''    y devuelve una cadena formateada con los minutos y 
    '''    segundos correspondientes 
    ''' </summary> 
    ''' <param name = "paramduracionSegundos"></param> 
    ''' <returns> 
    ''' Una cadena formateada como un instante de tiempo 
    ''' por ejemplo "03:20" [3 minutos y 20 segundos] </returns> 
    ''' <remarks> 
    '''  Esta función recibe un numero de segundos (en formato integer) y 
    '''  devuelve una cadena formateada con los minutos y segundos correspondientes 
    '''  Por ejemplo recibe 200 segundos y devuelve la cadena "03:20" 
    '''  Es decir 200 segundos son 3 minutos y 20 segundos 
    '''  Esta cadena se emplea como texto dentro del ProgressBar 
    '''  -- 
    '''  La función esta escrita como un Task para hacer un experimento y ver como funciona Task 
    '''  no es necesario escribirla así, solo tiene que convertir un numero en una cadena formateada 
    ''' </remarks> 
    Private Shared Function CalculoTextoCronometro(ByVal paramduracionSegundos As Integer) As String 

        Dim t1 As Task(Of String) = Task.Run(Function() 
                                                 Dim horas As Integer = 0I 
                                                 Dim minutos As Integer = 0I 
                                                 Dim segundos As Integer = 0I 
                                                 Const segundosDeUnaHora As Integer = 36000I '(3600 = 60x60) 
                                                 Const segundosDeUnMinuto As Integer = 60I 

                                                 Dim localDuracionSegundos As Integer = paramduracionSegundos 

                                                 Do While localDuracionSegundos > = segundosDeUnaHora '(3600 = 60x60) 
                                                     horas + = 1 
                                                     localDuracionSegundos - = segundosDeUnaHora '(3600 = 60x60) 
                                                 Loop 

                                                 Do While localDuracionSegundos > = segundosDeUnMinuto ' 60I 
                                                     minutos + = 1 
                                                     localDuracionSegundos - = segundosDeUnMinuto ' 60I 
                                                 Loop 

                                                 segundos = localDuracionSegundos 

                                                 Dim cadenaFormateada As String 
                                                 If horas > 0 Then 
                                                     cadenaFormateada = String.Format("{0:00}:{1:00}:{2:00}", horas, minutos, segundos) 
                                                 Else 
                                                     cadenaFormateada = String.Format("{0:00}:{1:00}", minutos, segundos) 
                                                 End If 

                                                 Return cadenaFormateada 
                                             End Function) 

        Return t1.Result 

    End Function 
End Class