Ver Mensaje Individual
  #2  
Antiguo 24-05-2011
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Reputación: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
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.

Última edición por Al González fecha: 24-05-2011 a las 08:14:58.
Responder Con Cita