Hola Antonio.
Aqui te dejo los dos prgs en donde trato de explicarte el problema que se me presenta.
el Primero, en el cual se construye un formulario y se integran TIMERS para controlar su duracion.Define Dialog oDlg resource "AD_Empresa" title 'Registro de Datos de la Empresa'
oDlg:lHelpIcon:=.f.
oDlg:SetFont(oFontDlg)
// aqui activo dos Timers: el _oTimerTabla1 es el tiempo que tiene el usuario para estar dentro del formulario
// se configura en otro modulo y queda en una variable publica. Yo, en lo personal asigno 10 minutos ya que lo considero
// suficiente. Pero como dije, queda a criterio del usuario.
// el _oTimerTabla2 es el mismo tiempo de _oTimerTabla1 menos 1 minuto.
Define Timer _oTimerTabla1 Interval _nInterval1 Action iif(fWorkTime(),(lSalir:=.t.,oDlg:end()),)
Activate Timer _oTimerTabla1
Define Timer _oTimerTabla2 Interval _nInterval2 Action iif(fWorkTime(),(lSalir:=.t.,oDlg:end()),)
Activate Timer _oTimerTabla2
// al cumplirse el timer 2, se le avisal al usuario que le queda 1 minuto para terminar sus operaciones con el formulario
// al cumplirse el timer 1, el formulario se cierra y retorna al menu principal.
********* fin de los timers
redefine bitmap oBmpLogo filename _cBmpLogo ID 180 of oDlg on right click fChangeLogo(@oBmpLogo)
oBmpLogo:lTransparent:=.t.
fDefineSays(@oDlg,aSays,aColors[3],aColors[1],oFontDlg)
Redefine get oGet00 Var cNombreEmpresa Id 100 of oDlg READONLY
oGet00:SetColor( _nCd_Black,_nCd_LBlue)
Redefine get oGet01 Var cRifEmpresa Id 101 of oDlg READONLY
oGet01:SetColor( _nCd_Black,_nCd_LBlue)
Redefine get oGet02 Var cLicencia Id 102 of oDlg
oGet02:SetColorFocus( CLR_YELLOW )
Redefine get oGet03 Var cDirec1 Id 103 of oDlg
Redefine get oGet04 Var cDirec2 Id 104 of oDlg
Redefine get oGet05 Var cBarrio Id 105 of oDlg
Redefine get oGet06 Var cReferencia Id 106 of oDlg
Redefine get oGet07 Var cDistrito Id 107 of oDlg
Redefine get oGet08 Var cProvincia Id 108 of oDlg
Redefine get oGet09 Var cDpto Id 109 of oDlg
Redefine get oGet10 Var cPais Id 110 of oDlg
Redefine get oGet11 Var cTelf1 Id 111 of oDlg
Redefine get oGet12 Var cTelf2 Id 112 of oDlg
Redefine get oGet13 Var cCelular Id 113 of oDlg
Redefine get oGet14 Var cFax Id 114 of oDlg
Redefine get oGet15 Var cMailEmpresa Id 115 of oDlg
Redefine get oGet16 Var cWebSite Id 116 of oDlg
Redefine get oGet17 Var cNotes Id 117 of oDlg memo
Redefine BTNBMP oBAceptar Resource 'BotonGrabar' left Id 150 Of oDlg prompt "Grabar" ;
action (lSalir:=fGrabarEmpresa(),;
iif(lSalir,oDlg:End(),oGet02:setfocus()))
*oBAceptar:setfont(_oFontButt)
oBAceptar:lTransparent:=.t.
Redefine BTNBMP oBSalir Resource 'Salir' left Id 155 Of oDlg prompt "Salir" ;
action (lSalir:=.t., oDlg:End())
oBSalir:lTransparent:=.t.
Activate dialog oDlg center on Init (FillWnd( oDlg,aColors[1],,,.t.),oGet02:SetFocus(),fCreateGetsArray(),fCreateButtsArray())
y el segundo que es donde se controlan los timers*****************************************************************************
Function fWorkTime()
local oDlgYesNo, oBNo, oBYes
local lFin :=.f.
local lTime :=.f.
local lSalir :=.f.
local oTimerT
Do Case
Case _nInterval2=(_nMinToInterval-1)*60000
// aca se cumple el primer timer y se le avisa al usuario que solo le queda un minuto
SndPlaySound( '.\Sonidos\error.wav' )
_nInterval2 :=(_nMinToInterval-1)*60000+1
_oTimerTabla2:Deactivate()
// se crea este dialogo donde se le pregunta si desea extender el tiempo o no
Define Dialog oDlgYesNo resource "AD_YesNo" // de no recibir respuesta, se cierra solo a los 30 segundos. Si el usuario responde, se cierra de inmediato
Redefine button oBYes Id 31 Of oDlgYesNo action (lTime :=.t. , lSalir:=.t.,oDlgYesNo:End()) // boton yes si desea extender el tiempo
Redefine button oBNo Id 101 Of oDlgYesNo action (lSalir:=.t. , oDlgYesNo:End()) // boton no si no desea extender el tiempo
Define Timer oTimerT Interval 30000 ACTION (oDlgYesNo:End(),oTimerT:End()) // timer que controla si el usuario no contesta y cierra el dialogo
Activate Timer oTimerT // a los 30 seg.
Activate Dialog oDlgYesNo centered On Paint FillWnd( oDlgYesNo,RGB(195,195,195))
oTimerT:End()
if lTime
_nInterval2:=(_nMinToInterval-1)*60000
_nInterval1:=_nMinToInterval*60000
_oTimerTabla1:Deactivate()
_oTimerTabla2:Deactivate() // si el usuario respondió que desea mas tiempo se reinician los timers
_oTimerTabla1:Activate()
_oTimerTabla2:Activate()
endif
Case _nInterval1=_nMinToInterval*60000
// este es el timer que indica la finalizacion del tiempo cuando no se obtiene respuesta del usuario
SndPlaySound( '.\Sonidos\error.wav' ) // hace la variable lFin = .t. y cuando se retorna, se cierra el formaulario y se vuelva al menu principal
MsgWait( "Estimado Usuario, el tiempo de la operación se ha agotado. La conexión con el servidor se cerrará","Tiempo agotado.")
lFin:=.t.
EndCase
Return lFin
*********************************************
aca te dejo tambien el link de descarga de dos videos con una duracion cerca de los 3 minutos cada uno donde puedes ver el comportamiento del programa y de los erroresvideo 1: http://www.softwarebinario.com/ml/EnFocus.rarvideo 2: http://www.softwarebinario.com/ml/SinFoco.rarEspero haya podido explicame bien para que puedas ver lo que esta sucediendo.
Gracias.