Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Funcionamiento interno del Timer (https://www.clubdelphi.com/foros/showthread.php?t=73908)

saldanaluis 24-05-2011 06:05:48

Funcionamiento interno del Timer
 
Compañeros del foro.

Tengo una duda que me gustaría me ayuden a resolverla. Es referente al funcionamiento del timer. Especificamente si el OnTimerEvent crea otro 'hilo' en la ejecución del programa desarrollado.
Ejemplo.
Si estoy en una pantalla actualizando datos de un registro de base de datos, y en ese momento se presenta el OnTimerEvent. ¿El proceso pasa el control al OnTimerEvent, y al terminar ese proceso regresa a donde estaba actualizando el registro de la base de datos?
¿Como funciona internamente?

Gracias por sus aclaraciones, que se me permitirán entender más el funcionamiento del Delphi.

Saludos...:confused:

Al González 24-05-2011 08:10:30

TTimer es una clase que encapsula a varias funciones de la API de Windows, facilitando con ello su uso de forma inadvertida.

Cuando un temporizador TTimer se encuentra habilitado (Enabled = True), tiene un intervalo de milisegundos distinto de 0 y su evento OnTimer tiene código asignado (manejador de eventos), el componente llama a la función SetTimer de la API de Windows.
Código Delphi [-]
procedure TTimer.UpdateTimer;
begin
  KillTimer(FWindowHandle, 1);
  if (FInterval <> 0) and FEnabled and Assigned(FOnTimer) then
    if SetTimer(FWindowHandle, 1, FInterval, nil) = 0 then
      raise EOutOfResources.Create(SNoTimers);
end;
Con ello el temporizador queda a la espera de un mensaje wm_Timer, enviado por el sistema operativo cada vez que transcurren los milisegundos indicados. Es importante aclarar que dicho mensaje es enviado en el contexto del hilo que hizo la llamada a SetTimer, por lo que ningún hilo nuevo es creado por estas funciones.

Tu programa debe continuamente procesar los mensajes que le llegan del sistema operativo para que sea posible que el evento OnTimer se ejecute. En una aplicación típica con permanente disponibilidad de la interfaz de usuario para que éste interactúe con ella no hay de qué preocuparse (el objeto Application se encarga del procesamiento de los mensajes). No obstante, si tu aplicación ejecuta en algún momento un bloque de instrucciones que demore un tiempo considerable, durante ese lapso no se procesarán los mensajes (y por tanto tampoco se ejecutará el evento OnTimer). Esto lo puedes resolver haciendo que dicho bloque de código contenga continuas llamadas al método Application.ProcessMessages (sobre el cual encontrarás mucho material en este foro).

Hay ocasiones en que lo anterior no es posible, debido a que la demora se localiza en código ajeno (en una DLL, en el motor de base de datos, en un componente que no podemos modificar, etc.). Entonces se suele optar por la creación de un hilo alterno, los cuales se ejecutan de manera simultánea con el hilo principal y sin depender de que éste procese o no los mensajes.

Si gustas indagar más, aquí se explican varias cosas interesantes relacionadas con el tema.

Un abrazo temporizado.

Al González. :)


La franja horaria es GMT +2. Ahora son las 05:37:21.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi