Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-07-2006
Avatar de Wonni
Wonni Wonni is offline
Miembro
 
Registrado: abr 2006
Posts: 261
Poder: 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
  #2  
Antiguo 17-07-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
El problema no es con la función GetTickCount, que tiene sus manías pero esta no es una de ellas. Lo que pasa es que la utilizas dentro de un bucle, si no haces algún tipo de espera dentro del bucle este termina usando la CPU al 100%. Una solución sencilla es hacer una pequeña espera dentro del bucle.

Código Delphi [-]
 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; 
   Sleep(100); // Aqui le damos tiempo a la CPU para respirar
  End;
Responder Con Cita
  #3  
Antiguo 17-07-2006
Avatar de Wonni
Wonni Wonni is offline
Miembro
 
Registrado: abr 2006
Posts: 261
Poder: 19
Wonni Va por buen camino
Gracias seoane, funciona muy bien

Ahora en el monitor de sistema consume exactamente igual GetTickCount que TTimer. No se mueve del 1% ( a veces 0 en ambos metodos ).

Entonces, supongo que da igual uno q otro. ¿no?

Saludos !!
Responder Con Cita
  #4  
Antiguo 17-07-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por Wonni
Entonces, supongo que da igual uno q otro. ¿no?
Yo creo que se utilizan para hacer cosas diferentes. Mientras que GetTickcount es muy útil para controlar el tiempo dentro dentro de una función, por ejemplo para implementar un Timeout, si lo que queremos es ejecutar un evento a intervalos regulares es mucho mejor usar un TTimer, que a fin de cuentas solo encapsula las APIs SetTimer y KillTimer.
Responder Con Cita
  #5  
Antiguo 17-07-2006
Avatar de Wonni
Wonni Wonni is offline
Miembro
 
Registrado: abr 2006
Posts: 261
Poder: 19
Wonni Va por buen camino
ok, ya me ha quedado claro.

Gracias otra vez seoane

Saludos !!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Ttimer en un Unit douguiehm Varios 4 22-07-2005 18:16:04
Imagenes con Ttimer zugazua2001 Gráficos 3 04-06-2005 23:00:53
Hilos y TTimer... Elfoscuro Varios 8 08-04-2005 10:18:07
Problemas con Ttimer ¡¡¡ elbilla Varios 2 21-09-2004 10:12:41
Manejo de un Ttimer miguel_fr OOP 3 21-06-2004 20:25:26


La franja horaria es GMT +2. Ahora son las 15:04:41.


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
Copyright 1996-2007 Club Delphi