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