Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-07-2007
b2k b2k is offline
Miembro
 
Registrado: may 2007
Posts: 24
Poder: 0
b2k Va por buen camino
Timer en consola

Hola a todos, pues estoy creando una aplicacion en delphi, modo consola y necesito saber como usara algo similar al Timer de delphi pero en modo consola.

Saldudos
Responder Con Cita
  #2  
Antiguo 20-07-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

No sé hasta qué punto he entendido las indicaciones del maestro Seoane o tengo que darles un buen repaso, pero, esto es lo que hay...

Código Delphi [-]
program ConsoleTimer;

{$APPTYPE CONSOLE}

uses
  Windows,
  Messages,
  SysUtils,
  ExtCtrls;

type
  TDummy = class(TObject)
    procedure TimerInterval(Sender: TObject);
  end;

var
  Dummy: TDummy;
  Timer: TTimer;
  Terminar: Boolean;

{ TDummy }

procedure TDummy.TimerInterval(Sender: TObject);
begin
  WriteLn(TimeToStr(Time)+' - Trigger TimeInterval');
end;

{ ConsoleTimer }

procedure ProcessMessages;
var
  Msg: TMsg;
begin
  while PeekMessage(Msg,0,0,0,PM_REMOVE) do
  begin
    if Msg.Message = WM_QUIT then
    begin
      Terminar:= TRUE;
      break;
    end else begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
  end;
end;

begin
  Terminar := false;
  Dummy := TDummy.Create();
  Timer := TTimer.Create(nil);
  Timer.OnTimer := Dummy.TimerInterval;
  Timer.Interval := 2000;
  try
    while not Terminar do
    begin
      // Aqui haz lo que quieras

      ProcessMessages();
      if not Terminar then
        Sleep(10);
    end;
  finally
    Timer.Free();
    Dummy.Free();
  end;
end.

Revisa este hilo y este otro.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 20-07-2007 a las 11:52:12.
Responder Con Cita
  #3  
Antiguo 20-07-2007
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
Prueba con esto:
Código Delphi [-]
program Ejemplo;

{$APPTYPE CONSOLE}

uses Windows, Messages, SysUtils;

var
  Terminar: Boolean;

procedure ProcessMessages;
var
  Msg: TMsg;
begin
  while PeekMessage(Msg,0,0,0,PM_REMOVE) do
  begin
    if Msg.Message = WM_QUIT then
    begin
      Terminar:= TRUE;
      break;
    end else
    begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
  end;
end;

function HandlerRoutine(dwCtrlType: DWORD): BOOL; stdcall;
begin
  Result:= TRUE;
  case dwCtrlType of
    CTRL_C_EVENT:
      Terminar:= TRUE;
    CTRL_CLOSE_EVENT:
      Terminar:= TRUE;
    CTRL_LOGOFF_EVENT:
      Terminar:= TRUE;
    CTRL_SHUTDOWN_EVENT:
      Terminar:= TRUE;
    else
      Result:= FALSE;
  end;
end;

procedure TimerProc(Wnd: HWnd; Msg, TimerID, SysTime: Longint); stdcall;
begin
  Windows.Beep(500,100);
end;

begin
  Terminar:= FALSE;
  if SetConsoleCtrlHandler(@HandlerRoutine,TRUE) then
  begin
    Writeln('Pulsa Ctrl+C para salir ...');
    // Aqui iniciamos el Timer
    SetTimer(0,0,1000,@TimerProc);
    while not Terminar do
    begin
      // Aqui haz lo que quieras
      ProcessMessages;
      if not Terminar then
        Sleep(10);
    end;
  end;
end.
Responder Con Cita
  #4  
Antiguo 20-07-2007
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
Caramba, otra vez me pisan la respuesta.
Responder Con Cita
  #5  
Antiguo 20-07-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

No; son respuestas distintas, por lo que veo.

Una pregunta Seoane, ¿sería preciso usar el "SetConsoleCtrlHandler" en el código que yo he propuesto, o, como pienso, basta con usar "ProcessMessage"? No tengo muy claras estas cosas, la verdad, incluso mi código es un fusilamiento que he hecho al tuyo.

PD. Para qué nos vamos a engañar... yo probé sin el "ProcessMessages", y, como ví que no funcionaba el "timer"... me acordé de uno de tu Hilos (que enlazo arriba).

PD2. Me parece, en todo caso, que tu solución es más elegante. Tampoco nos vamos a engañar en esto.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 20-07-2007 a las 11:57:16.
Responder Con Cita
  #6  
Antiguo 20-07-2007
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 dec
Una pregunta Seoane, ¿sería preciso usar el "SetConsoleCtrlHandler" en el código que yo he propuesto, o, como pienso, basta con usar "ProcessMessage"? No tengo muy claras estas cosas, la verdad, incluso mi código es un fusilamiento que he hecho al tuyo.
No, el SetConsoleCtrlHandle lo utilizo como una forma de salir de bucle. Si para la aplicación hay pensada otra forma de salir, que no sea cerrarla a lo bestia , no hace falta.

Cita:
Empezado por dec
PD. Para qué nos vamos a engañar... yo probé sin el "ProcessMessages", y, como ví que no funcionaba el "timer"... me acordé de uno de tu Hilos (que enlazo arriba).
Exactamente, sin bucle de mensajes no funcionan los timers.

Cita:
Empezado por dec
PD2. Me parece, en todo caso, que tu solución es más elegante. Tampoco nos vamos a engañar en esto.
Es muy similar, ya que al final el TTimer llama a la API SetTimer
Responder Con Cita
  #7  
Antiguo 20-07-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Seoane
Es muy similar, ya que al final el TTimer llama a la API SetTimer
Hombre, no me digas, ahí me veo yo usando una clase "dummy", la clase "TTimer", métodos, constructores, destructores... y llegas tú y con un "SetTimer" haces lo que se pide.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #8  
Antiguo 20-07-2007
tefots tefots is offline
Miembro
 
Registrado: feb 2005
Posts: 108
Poder: 20
tefots Va por buen camino
yo lo haria de otra forma que evita estar llamando a processmessages , es algo que no me gusta y trato de evitar .

con un thread a modo de timer ,y que te notifique cuando se cumpla el timer (Creo que las jvcl tienen un timer basado en thread) . en el execute del thread mira si ha pasado x tiempo desde la ultima vez y si es asi , resetea la variable tiempo y lo notifica en un evento, en la aplicación consola debes de capturar ese evento que genera el thread.

yo lo que hago es crearme una clase (en la unit de la consola) que reciba los eventos (aunque tambien podria crearte solo el evento).
TConsoleEvents=Class
Private
Public
Procedure OnTemporizador();
End;

y luego creas un objeto de tipo ConsoleEvents en la apl. consola
y asignas el evento del thread , al evento de la consola
Thread.Ontimer=ConsoleEvents.Ontemporizador.
luego en el evento de consoleevents hago lo que deseo hacer. (en el 1º ejemplo el tdummy hace lo mismo que el consoleevents que yo digo)

Procedure TConsoleEvents.OnTemporizador;
Begin
Writeln('Temporizador ');
End;

salud2.

Última edición por tefots fecha: 20-07-2007 a las 15:32:48.
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
Timer comba OOP 3 18-06-2007 16:54:00
Timer nenufer Varios 7 10-05-2006 16:35:17
timer +1 slim jim Varios 4 02-10-2005 04:03:11
Timer Malon OOP 5 25-11-2003 17:19:03
Timer kao Varios 6 30-06-2003 19:02:53


La franja horaria es GMT +2. Ahora son las 05:33:08.


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