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.

No hay comentarios:

Publicar un comentario

Comenta esta entrada