Ver Mensaje Individual
  #21  
Antiguo 11-07-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: May 2003
Posts: 907
Reputación: 16
andres1569 Va por buen camino
Hola Marc:

Quizás me expresé mal en la primera consideración; a lo que me refería con lo de acceder a los Timers no era por una cuestión del tiempo de vida de los mismos sino a que el Timer está declarado dentro de la clase TForm, mientras que la variable UltimoAcceso es global. Si escribimos Form1.Timer.Enebled, esto nos obliga a que Form1 esté creado (lo cual es cierto normalmente si Form1 está en la lista de AutoCreate Forms), pero esta asignación no funcionaría si Form1 fuera nil. Este es un problema general que se nos presenta cuando queremos acceder a componentes de un Form desde funciones que no pertenecen a la declaración de dicho form, tenemos que referirnoa a variables que no sabemos si se van a instanciar o no. Admito, de todas formas, que lo normal es que esto no suceda si hablamos del Form principal o del DataModule principal, que suelen instanciarse una vez (usando la variable declarada en su unit) y de forma automática al arrancar el programa.

Tanto en las dos soluciones que planteamos, una cosa parece clara, a cada evento de usuario se dispara, o bien en tu caso Timer.Enabled o como yo proponía GetTickCount, si es que lo entendí bien. En este caso, teniendo en cuenta la frecuencia con que se disparan los eventos (más sabiendo que hay eventos del mouse), creo que el rendimiento sí es fundamental.

Ahora se me ha ocurrido una forma de hacerlo que quizás no te agrade demasiado, porque declara 2 variables más, y es algo inexacta; la ventaja es que no entorpece la aplicación con llamada a métodos, lo cual puede ser crítico cuando se dan muchos eventos consecutivos (claro que con las máquinas de hoy quizás eso no se note demasiado):

1.- Declaramos dos nuevas variables globales, EventoOcurrido : Boolean, y TiempoTranscurrido : Longint;

2.- Cuando se produce un evento (ya sea con AppEvents o con Hooks), ponemos EventoOcurrido a TRUE;

3.- El TTimer lo fijamos a un intervalo de 10000 (10 segundos no afecta mucho a la aplicación), éste intervalo será el que marque la inexactitud.

4.- En el OnTimer del Timer escribimos algo así:
Código:
if EventoOcurrido then 
begin
  EventoOcurrido := FALSE;
  TiempoTranscurrido := 0;  
end
else begin
  Inc (TiempoTranscurrido, Timer1.Interval);
  if TiempoTranscurrido > 3600000 then DeconectarAplicacion
end;
Con esto nos evitamos el uso del GetTickCount y sus efectos secundarios, aunque tenga cierto margen de error, que no creo que importe demasiado en muchos casos.
Podríamos bautizarla como versión remix, v. 3.2 (si te parece, nombre interno Guillot1569).

Son ideas ... que cada uno escoja la que má le guste.

PD: Para los interesados comentar que el proyecto "Código Bloquear Aplicación después de cierto tiempo" está sujeto a la especificación GPL, todo el que quiera puede participar.
__________________
Guía de Estilo
Responder Con Cita