PDA

Ver la Versión Completa : Ttimer en un Unit


douguiehm
15-07-2005, 17:39:34
Que tal.

Estoy haciendo una aplicación que lee el puerto com1 para verificar si hay mensajes nuevos en un modem GSM.

Todo va bien, pero cuando pongo un Timer para que haga esta operación cada X segundos, el programa se alenta terriblemente, con lo cual llegué a la conclusion de que necesito separar el programa en dos partes:


Una visual donde se lean los mensajes y se escriban los mensajes nuevos.
Una no visual que solo haga el procesamiento de los mismos.
Todo va muy bien, pero en la parte no visual no logro configurar el Timer para que cada X segundos haga el procedimiento que necesito. En pocas palabras, no se como asignarle al Evento OnTimer un procedimiento.

Espero que me puedan ayudar.

Gracias

delphi.com.ar
15-07-2005, 17:49:20
El OnTimer es un procedure of object, así que no puedes apuntarlo a un regular procedure. Si tel código que escribiste es una clase, no tendrás problema alguno:

TMiClase = class
private
FTimer: TTimer;
procedure OnTimer(Sender: TObject);
public
constructor Create;
destructor Destroy; override;
end;

implementation

{ TMiClase }

constructor TMiClase.Create;
begin
FTimer := TTimer.Create(nil);
FTimer.OnTimer := OnTimer;
...
end;

destructor TMiClase.Destroy;
begin
FTimer.Free;
end;

procedure TMiClase.OnTimer(Sender: TObject);
begin
{ Tu código }
end;

douguiehm
15-07-2005, 17:59:34
Mil gracias por tu respuesta no rápida sino inmediata.

El problema era exactamente que lo estaba apuntando a un regular procedure.

Puedo seguir.

delphi.com.ar
15-07-2005, 18:24:15
No me agrada mucho, pero te escribí esto:

unit TimerRegularProcedure;

interface

uses
ExtCtrls;

type
TRegularProcedure = procedure;

THackTimer = class
private
FTimer: TTimer;
procedure OnTimer(Sender: TObject);
public
FRegularProcedure: TRegularProcedure;
constructor Create;
destructor Destroy; override;
end;


var
HackTimer: THackTimer;

implementation

uses
Dialogs;

{ THackTimer }

constructor THackTimer.Create;
begin
FRegularProcedure := nil;

FTimer := TTimer.Create(nil);
FTimer.OnTimer := OnTimer;
FTimer.Interval := 5000;
FTimer.Enabled := True;
{...}
end;

destructor THackTimer.Destroy;
begin
FTimer.Free;
end;

procedure THackTimer.OnTimer(Sender: TObject);
begin
if Assigned(FRegularProcedure) then
FRegularProcedure;
end;

procedure TimerEventos;
begin
{ Tu código}
ShowMessage('Hola Mundo!');
end;


initialization
HackTimer := THackTimer.Create;
HackTimer.FRegularProcedure := TimerEventos;

finalization
HackTimer.Free;

end.

douguiehm
22-07-2005, 18:16:04
Muchas gracias por tus respuestas, pero ahora el programa tiene comportamiento raros:

Como ya comenté este programa lee datos del puerto com1 para verificar mensajes nuevos, el problema es que después de leerlos los decodifica de cierta manera, al final de la decodificación, ingreso esos datos en una base de datos, pero el programa no llega a esta parte, simplemente se la brinca o no se que pasa pero le pongo break points y ni siquiera los toca, se brinca al final del programa y el timer vuelve a empezar.

¿Será que se cumple el tiempo del Timer y este corta el procedimiento que estaba haciendo?

Por favor, ayudenme porque esto es lo último que me falta para poder empezar a hacer pruebas al sistema.