Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Que se me active el segundo timer (https://www.clubdelphi.com/foros/showthread.php?t=18287)

Nbull 08-02-2005 10:27:53

Que se me active el segundo timer
 
Hola a tod@s de nuevo, despues de estar un tiempo desconectado vuelvo al club con mis dudillas,siento ser tan pesado.

Bueno,lo que me pasa ahora es que he colocado dos timer, vi en otro Hilo que explicabais como hacer que se ejecute mi aplicación a una hora, con ese ejemplo me funciona mi aplicación de lujo pero, a mi se me plantea el problema de que quiero que el ususario pueda cerrar la aplicación a los dos minutos por ejemplo.
Para eso me he colocado otro timer y le he llamado TimerEstablecido, pero no llega ha hacerlo.
Para llamar a ese timer lo que he echo es activarlo desde el timer que me inicia la aplicación a la hora que le diga, os paso el codigo y haber si veis vosotros algo mal:
Código Delphi [-]
 
procedure TForm1.TimerConexion1Timer(Sender: TObject);
var
Str: String;
ahora, mediaNoche : Tdatetime;
faltanMilisegundos : int64;
tiempoes,min : Word;
begin
 
{Miro si ha habido cambios en el Archivo ini}
ArchivoIni:= Tinifile.Create(Sinidir+'\config.Ini');
Hora :=StrToint(ArchivoIni.ReadString('Hora','H','00'));
Minutos := StrToint(ArchivoIni.ReadString('Minutos','Min','00'));
NTelefono := ArchivoIni.ReadString('NumTelefono','TLF','');
Testablecido := ArchivoIni.ReadString('TiempoConexion','Conexion','120');
ArchivoIni.Free;
 
{Calculo el tiempo que falta para cerrar}
ahora := now;
medianoche := ahora;
tiempoes := Strtoint(Testablecido);//Me lo pasan al Ini en segundos 
//desde la configuración
tiempoes := Tiempoes div 60;//Lo paso a minutos
min :=tiempoes + minutos;//Se lo sumo a los minutos de la 
//Hora que inicia mi aplicación
medianoche := RecodeTime(medianoche,Hora,min,00,999); // a la fecha actual, 
//le cambio la hora
faltanMilisegundos:= MillisecondsBetween(mediaNoche, ahora);
TimerEstablecido.Interval := faltanMilisegundos;
TimerEstablecido.enabled:= true;//Lo activo

Me pasan dos cosas o no me entra al codigo y no la cierra la aplicación o entra a la misma hora que se ejecuta mi aplicación, no se que puede ser:(

Un Saludo a todos y Gracias por vuestro tiempo.

Lepe 08-02-2005 11:32:49

No capto la cuestion.

Tienes 2 timer, TimerEstablecido es el de la media noche, y Conexión ???.

Una cosa si está clara. En el evento Timer solo entra cuando se finalice el intervalo especificado, por tanto, en ConexionTimer no entrará hasta que finalice el intervalo que lleva, en ese código no aparece el intervalo de Conexion1, así que no puedo dar más detalles.

En principio, yo activaría los timer desde el OnCreate de la ventana principal, y así los dos timer van independientes. Ahora mismo, TimerEstablecido depende de Conexion1.


OFFTOPIC:
Dale una visual a:
Archivoini.ReadInteger,
Archivoini.ReadTime,
Archivoini.ReadDatetime...

Y en la unidad DateUtils:
Minuteof(datetime)
secondof(datetime)

Saludito

Nbull 08-02-2005 17:12:07

Hola Lepe gracias por responder, he echo lo que tu me has dicho y lo he puesto en el oncreate, te comento, quiero hacer una aplicación que se ejecute todos los dias a las 8 de la tarde pero, que lo que hace es copiar un fichero etc...,quiero que si el usuario le dice que lo haga durante dos minutos que se pare a los dos minutos y hasta el dia siguiente no lo vuelva hacer.


El problema es que una vez que se ejecuta el timer que me lanza la aplicación no para de ejecutarse.Y yo solo quiero que se ejecute una vez al dia.

¿Como lo puedo resolver?:confused:

Gracias Lepe Un Saludo.

Coco 08-02-2005 19:11:28

Debes desactivar el timer en el evento ontimer del mismo, con la propiedad

procedure tform1.timer1OnTimer(...);
begin
timer1.enabled:= false;
//tus lineas de codigo
end;
De esta forma el timer1 se ejecutara solo una vez o hasta que desde otro lugar del codigo actives nuevamente el timer1.

Salu2

Nbull 11-02-2005 09:50:19

Hola Coco perdona que no te haya contestado antes, pero, como siempre hando pillao de tiempo. Gracias por tu aclaración ya he conseguido lo que que queria.


Un saludo.

Nbull 21-02-2005 13:08:05

Sigo sin hacerle funcionar
 
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.

maeyanes 21-02-2005 16:12:10

Podrías hacer que tu timer principal se active cada segundo, por ejemplo, y que en ese momento verifique la hora del sistema, si esta es igual a la hora de inicio, entonces ejecutas el proceso, de otra forma, no haces nada...

Código Delphi [-]
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if Time = TiempoInicio then
    DoProcess
end;
Time es una función de Delphi que devuelve la hora actual del sistema.


Saludos...

Lepe 21-02-2005 17:17:02

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 :confused:

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


La franja horaria es GMT +2. Ahora son las 19:40:15.

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