Ver Mensaje Individual
  #10  
Antiguo 04-07-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Reputación: 21
andres1569 Va por buen camino
Hola:

Tienes, razón, Lepe, ni siquiera lo probé en su día, y lo que me extraña es que le haya funcionado a Marcela, salvo si lo ha hecho con Delphi 4.0 o anterior. El evento OnIdle no es el más apropiado porque la aplicación recibe constantemente mensajes de todo tipo (de reloj, de repintado y otros internos ...) y a continuación, cuando no tiene qué hacer dispara este evento. He comprobado, como tú, que se dispara con demasiada frecuencia, no como yo pensaba.

Lo correcto es interceptar el evento OnMessage de TApplicationEvents y meter ahí el código que ya puse para la versión Delphi 4.0, es decir, chequear si se ha producido un mensaje de teclado o de ratón, que son los más normales de un usuario.

Otro error que he detectado es en la forma de comprobar si el mensaje es de teclado o de ratón, no vale usar un rango de constantes aquí, así que hay que sustituir:

(Msg.message in [WM_KEYFIRST .. WM_KEYLAST])
por
(Msg.message >= WM_KEYFIRST) AND (Msg.message <= WM_KEYLAST)

Lo mismo para los mensajes del mouse.

Todo quedaría así, para quien lo quiera usar, y que se olvide de lo anterior:
Código:
var
  UltimoAcceso: Longint;  // variable global

procedure TForm1.FormCreate(Sender: TObject);
begin
  UltimoAcceso := GetTickCount;
end;

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
    // interceptamos eventos de teclado y ratón
  if ((Msg.message >= WM_KEYFIRST) AND (Msg.message <= WM_KEYLAST)) OR
     ((Msg.message >= WM_MOUSEFIRST) AND (Msg.message <= WM_MOUSELAST)) then
    UltimoAcceso := GetTickCount;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if GetTickCount - UltimoAcceso > 3600000 then // 60 minutos
    Database1.Connected := FALSE;
end;
Esto ya está probado y cumple su cometido.

Lo de la clave de registro HKEY_PERFORMANCE_DATA en WinNT, yo he leído lo mismo que tú, por lo visto en esa clave del registro se almacena el tiempo transcurrido desde el arranque de Windows, lo que no sé es con qué frecuencia se actualiza ese valor. De lo que no me cabe duda es que no es un buen sistema para estar llamándolo constantemente, no es lo mismo llamar a una función como GetTickCount que está ya cargada en memoria (en su DLL correspondiente), que acceder a un fichero de varios megas para localizar ese valor.

Dijiste: Un saludote de tu pupilo menos aventajado
Digo yo: Mejor no seas pupilo de alguien que mete la pata de esta forma . Todos aprendemos de todos
__________________
Guía de Estilo
Responder Con Cita