Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-07-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 26
guillotmarc Va por buen camino
Hola.

Cita:
Posteado originalmente por andres1569
Las funciones callback que pasamos al Hook no son funciones de objetos, sino funciones "sueltas", por lo que no sé cómo en el cuerpo de estas funciones podríamos acceder a los TTimers (podríamos acceder a ellos mediante la expresión Form1.Timer.Enabled := FALSE, es decir referenciando la variable Form1, pero esto puede ser algo peligroso). Aunque a decir verdad las funciones Hooks siempre irán en el Form principal o en el DataModule principal, que normalmente estará activo durante toda la vida del programa, pero se debe tener en cuenta esa cuestión.
No creo realmente que hubiese problemas, es lo mismo que acceder a la variable UltimoAcceso que estará definido en el formulario principal, también tenemos que poner el Timer en ese formulario. Así aseguramos que el tiempo de vida del Timer sea el mismo que las llamadas a los Hooks. Si hubiera la posiblidad de que se ejecutarán en threads distintos si que habría que sincronizar (hay una función para eso) el acceso al Timer para asegurar que no se provoque un conflicto, pero no es el caso.

Cita:
Posteado originalmente por andres1569
De todas formas, el llamar a GetTickCount creo que es más eficiente que poner Timer1.Enabled := FALSE y luego TRUE
Completamente de acuerdo, aunque lo que tienes que comparar són la ejecución de tu función garfio, con el reseteo que propongo yo. Para el tema del rendimiento nos podemos olvidar de los disparos de los timers, en mi solución, simplemente porqué nunca se dispara, y en la tuya, porqué como dices, se puede definir para intervalos suficientemente largos como para despreciarlo.

Esta claro que poner en la función garfio un acceso a GetTickCount es más eficiente que resetear el Timer. No he propuesto esa solución por rendimiento, sinó como comentas, por la elegancia de solucionar el problema unicamente con dos componentes y dos lineas de código. (El rendimiento no siempre lo es todo).

Un saludo.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).

Última edición por guillotmarc fecha: 11-07-2003 a las 00:40:10.
Responder Con Cita
  #2  
Antiguo 11-07-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 24
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
  #3  
Antiguo 11-07-2003
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 26
kinobi Va por buen camino
Hola,

Cita:
Posteado originalmente por andres1569
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.
si está bajo licencia GPL, sería conveniente aclarar que allí donde se utilice (la aplicación que utiliza "Bloquear Aplicación después de cierto tiempo") también debe estar bajo los términos de la licencia GPL, y por tanto los fuentes deben estar a libre disposición pública.

Tal vez otro tipo de licencias: BSD, MPL, o incluso LGPL, pudiesen ser no tan exigentes al respecto.

Saludos.
Responder Con Cita
  #4  
Antiguo 11-07-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 26
guillotmarc Va por buen camino
Hola Andrés.

En efecto esta solución parece insuperable. Puesto que lo único que hacemos en el evento de usuario, es poner a cierto una variable booleana.

NOTA : Ni había pensado en la posiblidad que la variable UltimoAcceso fuese global. Es que nunca las uso, había pensado que sería una variable privada del formulario principal o del Datamodule principal, por eso comenté que el Timer tenia los mismos problemas de visibilidad y tiempo de vida que la variable.

Cita:
si está bajo licencia GPL, sería conveniente aclarar que allí donde se utilice (la aplicación que utiliza "Bloquear Aplicación después de cierto tiempo") también debe estar bajo los términos de la licencia GPL, y por tanto los fuentes deben estar a libre disposición pública.
Parece que habría que ir pensando en hacer una licencia cdPL (club delphi public license), derivada de la GPL, para solventar estos problemas

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #5  
Antiguo 12-07-2003
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Hola a todos.

Siento no haber contestado antes, pero estoy mas liado que un gato con un obillo de lana.


Al final lo he implementado como tu dices andres, pero ahorrandome esas variables.

he creado una rutina que se llama Actualiza ultimo acceso
Código:
procedure  TDTM.ActualizaUltimoAcceso();
begin
// bloqueo implementado mediante timer

  Timer1.Interval:= gl.Bloqueo.Minutos*60000;
  timer1.Enabled:=gl.Bloqueo.AutoBlock ;
end;
captando los mensajes de la aplicación
Código:
 if ((Msg.message >= WM_KEYFIRST) AND (Msg.message <= WM_KEYLAST)) OR
     ((Msg.message >= WM_MOUSEFIRST) AND (Msg.message <= WM_MOUSELAST)) then
        dtm.ActualizaUltimoAcceso ;
Así lo que hago es reiniciar el timer con el tiempo que haya establecido el usuario. Se supone que esas instrucciones las hará cuando el usuario no esté haciendo nada, y son solo 2 instrucciones.

Por otra parte, el Ontimer se ejecutará 1 vez cada 4 o 5 minutos y lo unico que hace es presentar la pantalla de bloqueo deshabilitando el timer hasta que se vuelva a Reconectar el usuario.

Quizás esté recargando el Applicantion.OnMessage, pero me olvido de saber cuando ha sido el UltimoAcceso del Usuario y si ha ocurrido el Evento o no.


Como bien decias esta es otra idea, que cada cual coja la que mas le guste


SALUDOS A TODOS y MUCHAS GRACIAS por el interés que han prestado.
Responder Con Cita
  #6  
Antiguo 16-04-2017
angelk3215 angelk3215 is offline
Registrado
 
Registrado: abr 2017
Posts: 2
Poder: 0
angelk3215 Va por buen camino
descarga la Cerradura AppLock es muy buena y es super liviana con esa seguro resuelves
bloqueodeaplicaciones.com
Responder Con Cita
  #7  
Antiguo 16-04-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 17
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Cita:
Empezado por angelk3215 Ver Mensaje
descarga la Cerradura AppLock es muy buena y es super liviana con esa seguro resuelves
bloqueodeaplicaciones.com
Eso no es para Android?
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 00:53:51.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi