*!* MAIN PROGRAM Variable declaration m._nFormTimeoutInSeconds = 600 *!* number of seconds inactivity to trigger timeout m._tLastUseractivityDateTime = DATETIME() *!* last time that activity was detected m._nLastKeyPressedbyuser = 0 *!* stores the last key pressed m._cLastMousePosition = "0,0" *!* MROW,MCOL values as string indicating the last mouse position detected. m._lApplicationIsBusyProcessing = .T. *!* set to .t. when running long processed and .f. when finished. m._cAutoShutdownFlagFile = "Shutdown4Maintenance.mem" *!* name of a file to check for to detect that the application *!* requires shutdown for maintenance m._cApplicationInUseSharedFile = "MYAPPLICATIONINUSE.MEM" *!* Open this file using fopen readonly when starting application m._nApplicationIsAliveFileHandle = 0 *!* file handle for m._cApplicationInUseSharedFile *!* if performing sys manintenance try to open read-write unbuffered *!* if you can do this no one is using the application. *!* m._nWaiting4UserToFinish = 2 *!* number of wait cycles to wait for user to complete what he is doing *!* before quitting when force shutdown is requested m._nWaiting2QuitCountdown = 0 *!* countdown vasriable to check when autoshuttingdown IF FILE(m._cAutoShutdownFlagFile) *!* forced shutdown is detected MESSAGEBOX("Application is unavailable due to system maintenance. Try again later. Quitting...") QUIT ENDIF m._nApplicationIsAliveFileHandle = FOPEN(m._cApplicationInUseSharedFile,0) IF m._nApplicationIsAliveFileHandle < 0 *!* application is being used exclusively for maintenance MESSAGEBOX("Application is unavailable due to system maintenance. Try again later. Quitting...") QUIT ENDIFIn the timer event set to fire every x number of seconds to check activity.
** Timer event THIS.ENABLED = .F. DO CASE CASE m._lApplicationIsBusyProcessing = .T. *!* application is busy with a process that should be *!* detected as activity m._tLastUseractivityDateTime = DATETIME() m._nLastKeyPressedbyuser = 0 m._cLastMousePosition = "0,0" m._nWaiting2QuitCountdown = 0 CASE FILE(m._cAutoShutdownFlagFile) *!* Someone has set a flag to signal autoshutdown for maintenance *!* and is waiting until all users are out. *!* start shutdown sequence *!* provide warning that system is shutting down to allow user *!* to close out of what they are doing, then quit IF m._nWaiting2QuitCountdown >= m._nWaiting4UserToFinish wait clear QUIT && executes your "on shutdown" procedure and exits ELSE WAIT WINDOW "System maintenance is required. "+; "Please complete all data entry and exit." NOWAIT NOCLEAR m._nWaiting2QuitCountdown = m._nWaiting2QuitCountdown +1 ENDIF CASE m._nLastKeyPressedbyuser = LASTKEY() ; AND m._cLastMousePosition = ; ALLTRIM(STR(MROW()))+","+ALLTRIM(STR(MCOL())) IF DATETIME()- m._tLastUseractivityDateTime ; > m._nFormTimeoutInSeconds *!* inactivity detected for too long *!* begin shutdown sequence QUIT && executes your on shutdown procedure and exits ENDIF OTHERWISE *!* keyboard activity or mouse activity detected - set activity variables m._tLastUseractivityDateTime = DATETIME() m._nLastKeyPressedbyuser = LASTKEY() m._cLastMousePosition = = ALLTRIM(STR(MROW()))+","+ALLTRIM(STR(MCOL())) m._nWaiting2QuitCountdown = 0 ENDCASE THIS.RESET THIS.ENABLED = .T.