Mostrando entradas con la etiqueta Tiempos. Mostrar todas las entradas
Mostrando entradas con la etiqueta Tiempos. Mostrar todas las entradas

jueves, 17 de octubre de 2024

Funciones. Tiempos.

Usos del servicio Timer

Aclarar en primer lugar que ahora no estamos hablando de la función Timer(), sino del uso de un servicio o clase definida en el código que sustenta LibreOffice. Se trata, en realidad, de una clase, por lo que contiene procedimientos y métodos, que explicaremos en esta entrada (1). Por este motivo, esta entrada presenta mayor complejidad que otras creadas con un objetivo explicativo similar. 



La función Timer(), vista en [esta entrada], presenta una limitación en cuanto a la unidad de tiempo mínima: sólo nos permite conocer los segundos transcurridos, pero no nos da información sobre unidades inferiores (milisegundos), por lo que no satisface nuestras necesidades de conocimiento de periodos temporales que se midan en esa unidad (2). Para acceder al conocimiento de estas unidades inferiores al segundo, es necesario hacer uso del servicio Timer, disponible en la librería ScriptForge (3).

Acceder al conjunto de propiedades y métodos de que consta este servicio, requiere importar previamente esa librería, procedimiento que se resuelve mediante GlobalScope.BasicLibraries.LoadLibrary("ScriptForge"), como tendremos ocasión de comprobar en los script de ejemplo con los que trabajaremos en esta entrada.

Sub TimerServicio1
GlobalScope.BasicLibraries.LoadLibrary("ScriptForge")
Dim myTimer As Variant
Dim Tmp As Double
'El cronómetro comienza inmediatamente cuando el segundo argumento = Verdadero, siendo el valor predeterminado = Falso
myTimer = CreateScriptService("Timer", True)
Wait 1000
Tmp = myTimer.Duration
MsgBox Tmp
'Es recomendable liberar recursos después del uso de Timer, cerrándolo.
Set myTimer = myTimer.Dispose()
End Sub

En este script accedemos al servicio (GlobalScope.BasicLibraries.LoadLibrary("ScriptForge")) asignándolo a la variable myTimer (de tipo Variant) y visualizamos el transcurso del tiempo mediante la variable Tmp (tipo Double), a la que asignamos el contenido de la variable myTimer, sobre la que aplicamos la propiedad Duration (4).

La función del servicio Timer es medir el intervalo de tiempo necesario para ejecutar la secuencia de órdenes dadas por el usuario, esto es: funcionar como temporizador.

Como clase cuenta con las siguientes propiedades, todas ellas de sólo lectura...
  • Duration (Duración). Asignar a variable Double. Contabiliza el tiempo real de ejecución transcurrido desde el inicio o entre inicio y parada, aunque no considera tiempo suspendido.
  • IsStarted (Está iniciado). Asignar a variable Boolean. Devuelve True cuando se inicia o cuando se suspende el cronómetro.
  • IsSuspended (Está suspendido). Asignar a variable Boolean. Devuelve True cuando se inicia y suspende el cronómetro.
  • SuspendDuration (Suspender la duración). Asignar a variable Double. Indica el tiempo real transcurrido mientras está suspendido desde el inicio o entre el inicio y la parada.
  • TotalDuration (Duración total). Asignar a variable Double). Indica el tiempo real transcurrido desde el inicio o entre el inicio y la parada (incluidas las suspensiones y el tiempo de ejecución). TotalDuration equivale a sumar las propiedades Duration y SuspendDuration.
... y con los siguientes métodos (funciones), que no requieren parámetros y devuelven un valor booleano.
  • Continue() (Continuar) Reanuda el Timer si ha sido suspendido. Devuelve False si el cronómetro no está suspendido.
  • Restart() (Reanudar) Finaliza el temporizador y descarta sus valores de propiedad actuales, reiniciándose como un nuevo temporizador limpio. Devuelve False si el temporizador está inactivo.
  • Start() (Iniciar, comenzar)  Inicia un temporizador nuevo. Devuelve False si el cronómetro ya está iniciado.
  • Suspend() (Suspender) Suspende un temporizador en ejecución Devuelve False si el cronómetro no está iniciado o ya está suspendido.
  • Terminate() (Terminar, finalizar) Detiene un temporizador en ejecución. Devuelve False si el cronómetro no se inicia ni se suspende.
Si llama al método Terminate(), las llamadas posteriores al método Continue() no reanudarán la medición del tiempo. De manera similar, después de que se haya terminado un temporizador, llamar al método Start() lo reinicia como si fuera un temporizador nuevo y limpio.

Veamos un script de ejemplo de cómo usar propiedades y métodos del servicio Timer. Las explicaciones se incluyen en el código como comentarios (en negro):

Sub TimerServicio2

GlobalScope.BasicLibraries.LoadLibrary("ScriptForge")
Dim myTimer As Variant
myTimer = CreateScriptService("Timer", True)

myTimer.Start() 'Inicia el temporizador
Wait 500
myTimer.Suspend() 'Suspende el temporizador

'Uso de las propiedades Duration, SuspendDuration y TotalDuration en MsgBox
'El tiempo transcurrido mientras el cuadro de diálogo esté abierto se contará como tiempo suspendido
MsgBox "Duración: " & myTimer.Duration & Chr(13) & "Tiempo de suspensión: " & myTimer.SuspendDuration & Chr(13) & "Duración total: " & myTimer.TotalDuration

myTimer.Continue() 'Reanuda el temporizador
Wait 500

'Uso de las propiedades Duration, SuspendDuration y TotalDuration en MsgBox.
'El tiempo transcurrido mientras el cuadro de diálogo está abierto se contará como tiempo de ejecución
MsgBox "Duración: " & myTimer.Duration & Chr(13) & "Tiempo de suspensión: " & myTimer.SuspendDuration & Chr(13) & "Duración total: " & myTimer.TotalDuration

myTimer.Terminate() 'Detiene el temporizador

'Uso de las propiedades Duration, SuspendDuration y TotalDuration en MsgBox
'Mediante MsgBox se muestran las mediciones de tiempo finales
MsgBox "Duración: " & myTimer.Duration & Chr(13) & "Tiempo de suspensión: " & myTimer.SuspendDuration & Chr(13) & "Duración total: " & myTimer.TotalDuration

End Sub


NOTAS

(1) Esta explicación se basa en el documento que ofrece la ayuda oficial de LibreOffice (ver en este enlace el texto original)
(2) Lo cual resulta necesario cuando queremos conocer tiempos de respuesta breves, como los que tarda un alumno en responder a un ítem.
(3) Esta librería es accesible desde el IDE siguiendo la siguiente ruta: Macros y diálogos de la aplicación | ScriptForge | SF_Timer, aunque lo que corresponde para acceder a ella es importarla mediante la instrucción GlobalScope.BasicLibraries.LoadLibrary("ScriptForge"), como tendremos ocasión de ver en la entrada. El contenido de SF_Timer nos muestra el código desarrollado, resultando evidente su formulación como clase, con sus propiedades y métodos. Para una sencilla introducción al paradigma de la Programación Orientada a Objetos (POO), ver [esta entrada].
(4) Podemos comprobar que la unidad de tiempo de base es el segundo, al que se añaden los milisegundos como parte decimal (de ahí que sea necesario utilizar variables de tipo decimal, como Double). Comparte la unidad con la función Timer(), pero no como medida del tiempo transcurrido desde medianoche, sino desde que se activa el servicio. Sobre la propiedad Duration ver la explicación dada en la entrada.

miércoles, 16 de octubre de 2024

Funciones. Tiempos.

Función Timer

La función Timer nos devuelve el tiempo transcurrido desde medianoche en segundos. Gracias a ella podemos capturar el tiempo transcurrido, lo que la diferencia de la función Now(), que nos devuelve la fecha y la hora actual del sistema. 



Esta funcionalidad de Timer resulta de gran interés para construir cronómetros basados en el segundo como unidad de tiempo, lo que puede resultar suficiente para muchos usos. Para obtener este valor es necesario que declaremos una variable de tipo Long y asignemos a ella la función. De no hacerlo así obtendremos como resultado un valor de fecha de escasa utilidad.

Además presenta el inconveniente contrario al que observamos en Now(): si queremos saber la hora actual deberemos realizar un procedimiento de conversión de las unidades superiores (horas y minutos). El [script siguiente] (1) muestra este proceso.

Sub EjemploTimer

Dim lSeg As Long,lMin As Long,lHora As Long
      
lSeg = Timer
MsgBox lSeg, 0, "Segundos transcurridos desde medianoche"
      
'Procedimientos de converisón del Timer en horas, minutos y segundos 
lMin = Int(lSeg / 60)
lSeg = lSeg Mod 60
lHora = Int(lMin / 60)
lMin = lMin Mod 60
      
MsgBox Format(lHora,"00") & ":"& Format(lMin,"00") & ":" & Format(lSeg,"00"),  0, "Hora actual"
 
End Sub

Observa, en primer lugar, que todas las variables está definidas como de tipo Long, a fin de evitar el inconveniente indicado.

La parte del código que recurre a la función Timer se concreta en la segunda línea (lSeg = Timer), constituyendo el resto procedimientos secundarios. El primero de ellos (MsgBox lSeg, 0, "Segundos transcurridos desde medianoche") visualiza el resultado de asignar la función a la variable, y el resto ilustra el modo en que podemos obtener la hora actual del sistema realizando las operaciones pertinentes para convertir el valor obtenido en su expresión horaria. Así, por ejemplo, lMin = Int(lSeg / 60) divide el dato entre 60 para obtener el valor equivalente en minutos (lSeg = lSeg Mod 60 conserva el resto de la división como segundos) y posteriormente, mediante lHora = Int(lMin / 60obtenemos las horas, conservando el resto de la división como minutos (lMin = lMin Mod 60).

NOTA

(1) Este script es mera "traducción" del usado como ejemplo en la ayuda oficial de LibreOffice. Se aconseja acceder a ella mediante el enlace.

sábado, 5 de octubre de 2024

Funciones. Tiempos.

Reloj interno.

Ya vimos [en otra entrada] las funciones Calc de fecha y hora. En esa entrada se indicaron las funciones Built-In equivalentes. Dedicaremos esta entrada a explicar la primera de ellas.



Empezaremos por la función Now(), que presenta algunas características específicas que la asimilan a las de las instrucciones (1) y que, como función, juega un papel auxiliar respecto al resto de las función Built-In de tiempo, como es la de ser usada como argumento de esas otras funciones (2).

La función Now() (ahora) no recibe ningún argumento (ver 1) y devuelve una expresión temporal compleja, compuesta de la fecha y hora del reloj interno de nuestro sistema. Así, MsgBox Now() devuelve 05/10/2024 12:11:25. El formato de fecha y hora depende de cómo lo tengamos configurado y el contenido se ajustará siempre al momento en el que ejecutemos la función, por lo que no será nunca el mismo (3

Sobre Now(), o mejor dicho, usándola como parámetro, podremos trabajar con otras funciones Built-In de fecha y hora, las cuales veremos en entradas sucesivas.


NOTAS

(1) Now() es una función sin argumentos, por lo que se puede expresar con o sin paréntesis.
(2) Como, por ejemplo, en Second(Now)
(3) Esto nos obliga a almacenar el dato en una variable o en una matriz si es que queremos conservarlo para usos posteriores.

Funciones Tiempos.

Tiempos de demora

En muchos proyectos de automatización, y especialmente en los desarrollo de recursos de evaluación e intervención, el control del tiempo puede ser parte fundamental del algoritmo. Para ello contamos en OOo Basic con dos enfoques de trabajo, el que se orienta al establecimiento de tiempos de demora o espera entre las diferentes partes de un proceso y el que permite conocer el tiempo que emplea el alumno en ejecutar una tarea. En esta entrada vamos a tratar sobre el primero.



Concretamente sobre la instrucción wait (esperar). Aunque se trata de una instrucción y no de una función, me ha parecido más coherente tratarlo en el apartado de Funciones que reservar un subapartado específico dentro de Lenguaje, por la relación que tiene en las funciones Built-In de OOo Basic y por el escaso contenido que tendría un subapartado específico en esta última sección.

Esta instrucción nos permite establecer un tiempo de demora entre la ejecución de un procedimiento y el que sigue. Es de muy fácil implementación en el código y resulta muy transparente, por lo que su uso no ofrece dificultades: únicamente tenemos que escribirla seguida del tiempo de espera que deseemos se produzca, eso sí, en milisegundos; así wait 1000 establece un tiempo de demora de 1 segundo.