Tema: Timers
Ver Mensaje Individual
  #6  
Antiguo 07-04-2005
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: 30
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
Smile Thread para iteraciones temporizadas

¡Buen día a todos!

He leído en diversos lugares (y lo he comprobado) que por lo general es preferible usar un hilo (thread) de ejecución alterno en lugar de un temporizador (timer), cuando se busca una buena precisión de tiempo (hasta de milisegundos) para llevar a cabo la acción temporizada.

Cuando se trata de crear un hilo de ejecución alterno, la ayuda de Delphi aconseja una forma básica de hacerlo, la cual consiste en crear una nueva clase de objeto derivada de TThread, redefiniendo su método Execute para incluir en éste el código que deseamos se ejecute dentro del hilo.

Sin embargo, algunos desarrolladores han expresado su incomodidad por seguir este procedimiento, argumentando que es demasiado código el que hay que escribir sólo para hacer que el programa corra otro hilo en el fondo. Esto depende de la percepción que cada programador tiene en cada circunstancia específica de su trabajo (puede ser un proyecto de entrega urgente, una aplicación con varios hilos alternos, etc.).

Considerando todo lo anterior, hace tiempo me di a la tarea de crear una clase derivada de TThread, la cual llamé TghThread. Tiene la ventaja de que al instanciar un objeto TghThread se pueden indicar como parámetros:

1. El nombre de un método que el hilo deberá ejecutar repetitivamente.
2. El intervalo de tiempo en milisegundos para que, a manera de temporizador preciso, dicho método se ejecute cada cierto tiempo.

Ejemplo:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IGHTareas;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    HiloReloj :TghThread;  { Hilo de Reloj }
    Procedure Reloj;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

Procedure TForm1.Reloj;
Begin
  Label1.Caption := FormatDateTime ('hh:nn:ss.zzz', Time ());
End;

{ Manejadores de eventos }

procedure TForm1.FormCreate(Sender: TObject);
begin
  { Establecer el método Reloj como procedimiento a ejecutarse cada 20
    milisegundos en un hilo alterno }
  HiloReloj := TghThread.Crear (Reloj, 20);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  HiloReloj.Free;
end;

end.
Como puede observarse, con TghThread no es necesario crear una nueva clase de objeto para establecer un hilo adicional en nuestra aplicación. Puede usarse fácilmente como un temporizador de alta precisión, colocando el método a ejecutar en alguna forma o módulo de datos de nuestro programa. Obviamente este ejemplo de reloj en pantalla, como tal, no tiene mucha aplicación práctica que digamos, pero nos ilustra de manera sencilla lo que podríamos hacer cuando queramos que nuestra aplicación ejecute iterativamente y con alta frecuencia alguna tarea en particular.

TghThread es freeware, incluye los fuentes y forma parte de la biblioteca Interfaz GH para Delphi 7. También pueden solicitármelo directamente, con toda confianza.

Un abrazo a todos.

Al González.
Responder Con Cita