Hola shoulder.
Se me ocurre que podrías usar una solución basada en eventos.
Hice un ejemplo el cuál deberías modificar para que los datos se tomen de la tabla de usuarios en la creación.
Además en la renovación del tiempo, evaluar que el usuario realize alguna acción. (yo lo hice pulsando un botón como prueba)
Algo como:
Código:
interface
...
type
TUsuario = class;
TEventoFinSesion = procedure (User: TUsuario) of object;
TUsuario = class
private
FNombre: string;
FPasswd: string;
FTiempoInactivo: TTime;
FTimer: TTimer;
procedure TiempoAgotado(Sender: TObject);
public
EventoFinSesion : TEventoFinSesion;
constructor Create(ANombre,APasswd: string);
destructor Destroy; override;
property Nombre: string read FNombre write FNombre;
property Passwd: string read FPasswd write FPasswd;
procedure RenewTime;
end;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
public
procedure InitTimeUsr(Sender: TObject);
procedure UsuarioFuera(Usr: TUsuario);
end;
var
Form1: TForm1;
Usuario: TUsuario;
implementation
{ TUsuario Create }
constructor TUsuario.Create(ANombre, APasswd: string);
begin
FNombre:= ANombre;
FPasswd:= APasswd;
FTiempoInactivo:= Time;
FTimer:= TTimer.Create(nil);
with FTimer do
begin
Enabled:= False;
Interval:= 1000*60*90; // 90 minutos
OnTimer:= TiempoAgotado;
Enabled:= True;
end;
end;
{ TUsuario Destroy }
destructor TUsuario.Destroy;
begin
FTimer.Free;
inherited Destroy;
end;
{ TUsuario Renovar tiempo }
procedure TUsuario.RenewTime;
begin
FTiempoInactivo:= Time;
with FTimer do
begin
Enabled:= False;
Interval:= 1000*60*90; // otros 90 minutos
Enabled:= True;
end;
end;
{ TUsuario Tiempo agotado }
procedure TUsuario.TiempoAgotado(Sender: TObject);
begin
FTimer.Enabled:= False;
if Assigned(EventoFinSesion) then
EventoFinSesion(Self);
end;
LLamadas:
Código:
{ Inicia sesion }
procedure TForm1.InitTimeUsr(Sender: TObject);
begin
Usuario:= TUsuario.Create('JUAN', '123');
Usuario.EventoFinSesion:= UsuarioFuera;
end;
{ Prueba, ingreso del usuario }
procedure TForm1.Button1Click(Sender: TObject);
begin
InitTimeUsr(Self);
end;
{ Tiempo inactivo cumplido }
procedure TForm1.UsuarioFuera(Usr: TUsuario);
begin
ShowMessage('El usuario '+Usr.Nombre+
'inactivo durante 90 min. Sesión terminada');
Usr.Free;
end;
{ Realizó alguna operacion, se le conceden 90 min + }
procedure TForm1.Button2Click(Sender: TObject);
begin
Usuario.RenewTime;
end;
Espero que la idea te sirva.
Saludos.