Ver Mensaje Individual
  #1  
Antiguo 17-07-2006
Avatar de Wonni
Wonni Wonni is offline
Miembro
 
Registrado: abr 2006
Posts: 261
Reputación: 19
Wonni Va por buen camino
GetTickCount vs. TTimer

Hola

Tengo el libro de los tomos de Delphi: "Nucleo del Api Win32" y en el capitulo 15 ( Funciones de temporización ) trae un ejemplo de como emular un temporizador. El ejemplo muestra un label parpadeando. El caso es que yo pense que tratando con el Api ( tal y como dice el libro ) se consigue una mejor ejecucion del programa, consumir menos recursos. Pues resulta que construyo el programita con dos opciones:

1ª - Mostrar el label parpadeando con un TTimer y
2ª - Mostrar el label parpadeando con el codigo que trae el libro utilizando GetTickCount.

Cuando ejecuto el programa con el TTimer, voy al monitor del sistema y el uso de CPU no sube nunca del 1 %

Cuando ejecuto el programa con GetTickCount, el uso de CPU no se mueve del 100 % !!!!

¿como es posible? se supone que deberia ser mas liviano.

Este es el codigo completo:

Código Delphi [-]
unit Principal;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
type
  TFormPrincipal = class(TForm)
    BotonIniciarConGet: TButton;
    LabelDelphi: TLabel;
    BotonDetenerGet: TButton;
    BotonIniciarConTTimer: TButton;
    BotonDetenerTTimer: TButton;
    TimerParpadeo: TTimer;
    procedure BotonIniciarConGetClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure BotonDetenerGetClick(Sender: TObject);
    procedure BotonIniciarConTTimerClick(Sender: TObject);
    procedure BotonDetenerTTimerClick(Sender: TObject);
    procedure TimerParpadeoTimer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  FormPrincipal: TFormPrincipal;
  Running: Boolean;     // variable de control del bucle

implementation
{$R *.dfm}
Procedure Timerando;
Begin
End;
Procedure FlashLoop;
Var
 StartTick: DWORD;   // Hora de inicio
Begin
 //Obtener la hora actual
 StartTick := GetTickCount;
 //Si el bucle continua...
 While Running Do
  Begin
   //...si ha trasncurrido un segundo
   If (GetTickCount - StartTick) > 1000 Then
    Begin
     //...actualizar etiqueta
     FormPrincipal.LabelDelphi.Visible := not FormPrincipal.LabelDelphi.Visible;
     //Reinicializar hora de inicio para siguiente iteracion
     StartTick := GetTickCount;
    End;
   // Necesario para que el bucle no "bloquee" la maquina
   Application.ProcessMessages; 
  End;
End;
procedure TFormPrincipal.BotonIniciarConGetClick(Sender: TObject);
begin
 //Inicializar variable de control...
 Running := TRUE;
 //... y lanzar el bucle
 FlashLoop;
end;
procedure TFormPrincipal.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Running := FALSE;
 TimerParpadeo.Enabled := FALSE;
end;
procedure TFormPrincipal.BotonDetenerGetClick(Sender: TObject);
begin
 Running := FALSE;
end;
procedure TFormPrincipal.BotonIniciarConTTimerClick(Sender: TObject);
begin
 TimerParpadeo.Enabled := TRUE;
end;
procedure TFormPrincipal.BotonDetenerTTimerClick(Sender: TObject);
begin
 TimerParpadeo.Enabled := FALSE;
end;
procedure TFormPrincipal.TimerParpadeoTimer(Sender: TObject);
begin
 FormPrincipal.LabelDelphi.Visible := not FormPrincipal.LabelDelphi.Visible;
end;
end.

Saludos !!
Responder Con Cita