Ver Mensaje Individual
  #8  
Antiguo 21-02-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Reputación: 29
Lepe Va por buen camino
Cita:
Empezado por Nbull
Perdonar que reabra el Hilo,pero, es que tengo un pequeño problema con los timer.

He colocado dos timer en mi aplicación uno para que me haga una serie de cosas a la hora que le indique el usuario todos los dias, es decir, todos los dias a las 5 de la tarde que haga x cosas y otro para que a los dos minutos me cierre esos procesos. Para eso tengo el siguiente codigo :

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
var
ahora, mediaNoche,empieza, cortar: Tdatetime;
faltanMilisegundos,faltanMiliseg : int64;
tiempoes,min : Word;
begin
//Leo de Config.ini la Hora y los Minutos
 
//Hora que comienza la llamada al modem
 ahora := now;
 medianoche := ahora;
 medianoche := RecodeTime(medianoche,Hora,Minutos,00,999); // a la fecha actual, 
//le cambio la hora
faltanMilisegundos := MillisecondsBetween(ahora, medianoche);
timer1.Interval := faltanMilisegundos;
timer1.enabled := true;
{Calculo el tiempo que falta para cortar los procesos}
  empieza := now;
  cortar := empieza;
  Tiempoes := Testablecido;
  min :=tiempoes + minutos;
  If(min>=60)then
  begin
    min:=min-60;
  end;
  cortar := RecodeTime(cortar,Hora,min,00,000); // a la fecha actual,
// le cambio la hora
  faltanMiliseg:= MillisecondsBetween(empieza, cortar);
  TimerEstablecido.Interval := faltanMiliseg;
end;

Y en el pimer timer tengo lo siguiente:

Código Delphi [-]
 
procedure TForm1.Timer1Timer(Sender: TObject);
var
Str:string;
begin
//Desactivo el timer que se ejecuta a la hora que le digo
  Timer1.Enabled:=false;
//Activo el timer que me acaba los procesos a los dos minutos
  TimerEstablecido.Enabled:=true;
//Aquí mis procesos...

En el segundo timer:

Código Delphi [-]
 
procedure TForm1.TimerEstablecidoTimer(Sender: TObject);
var
ahora1, mediaNoche1,empieza1, cortar1: Tdatetime;
faltanMilisegundos1,faltanMiliseg1 : int64;
tiempoes1,min1 : Word;
begin
  TimerEstablecido.Enabled:=false;
//Leo los datos del archivo Config.Ini
getdir(0,SiniDir);
ArchivoIni:= Tinifile.Create(Sinidir+'\config.Ini');
Hora :=ArchivoIni.ReadInteger('Hora','H',0);
Minutos := ArchivoIni.ReadInteger('Minutos','Min',0);
Testablecido := ArchivoIni.ReadInteger('TiempoConexion','Conexion',1);
ArchivoIni.Free;
//Hora que comienza los procesos
 ahora1 := now;
 medianoche1 := ahora1;
 medianoche1 := RecodeTime(medianoche1,Hora,Minutos,00,999); // a la fecha actual, 
//le cambio la hora

faltanMilisegundos1:= MillisecondsBetween(ahora1, medianoche1);
timerConexion1.Interval := faltanMilisegundos1;
timerConexion1.enabled:= true;
{Calculo el tiempo que falta para cortar la llamada}
  empieza1 := now;
  cortar1 := empieza1;
  Tiempoes1 := Testablecido;
  min1 :=tiempoes1 + minutos;
  If(min1>=60)then
  begin
    min1:=min1-60;
  end;
  cortar1 := RecodeTime(cortar1,Hora,min1,00,000); // a la fecha actual, 
//le cambio la hora
  faltanMiliseg1:= MillisecondsBetween(empieza1, cortar1);
  TimerEstablecido.Interval := faltanMiliseg1;
 end;

En el segundo le digo que mañana a las 5 de la tarde o a la hora que sea se ejecuten otra vez los procesos,pero, la put... es que se me ejecutan a los 3 o cuatro minutos otra vez, no lo entiendo por que al iniciar mi aplicación todo funciona bien y hasta que no llega la hora que hay en el archivo config.ini no se ejecuta y es el mismo codigo.

Ha ver si veis algo que este mal y como lo puedo solucionar.Yo lo que quiero es que todos los dias a la misma hora me haga lo mismo.

PD:El Pc estara encendido y mi programa ejecutandose.No quiero usar el administrador de tareas de Windows.

Gracias por vuestro tiempo. Un saludo.
En el Oncreate sabes que TEstablecido es cero verdad??? aun no se ha leido desde el .ini ese valor

A medianoche1 no le cambias la fecha, solo la hora, minutos y segundos, por tanto, faltanmilisegundos no va a tener el valor que esperas!!!.

medianoche1 := ahora1 + 1 ; // 1 dia más
y ahora haz el recodeTime.

Por otra parte ten cuidaddo como pasas los parametros a MillisecondsBetween , si le das el orden contrario, tendrás milisegundos negativos, y estarás poniendo al timer un valor negativo en interval.

faltanMilisegundos1:= MillisecondsBetween(ahora1, medianoche1); dependiendo de la hora actual, puede ser positivo o negativo.

saludos

Última edición por Lepe fecha: 21-02-2005 a las 17:19:25.
Responder Con Cita