Página 1 de 1
Inatividade de Sistema
Enviado: 19 Nov 2020 11:57
por asimoes
Tenho essa função para testar a inatividade do sistema, o problema é que o Idle para quando uma função modal é executada tipo hwg_msginfo é executada, o intuito é saber se o sistema está em uso e inativo por x horas e derrubar ele.
Código: Selecionar todos
nMonitor := Hb_IdleAdd( {|| Inatividade() } )
hwg_msginfo("Teste")
FUNCTION Inatividade()
THREAD STATIC nSeconds
IF nSeconds = Nil
nSeconds := Seconds()
ENDIF
IF Round( InatividadeSistema(), 0 ) == 0
nSeconds := Seconds()
ENDIF
IF Seconds() - nSeconds >= 10
nSeconds := Nil
hwg_ExitProcess()
ENDIF
RETURN Nil
#pragma BEGINDUMP
#include "windows.h"
#include "time.h"
#include "hbapi.h"
HB_FUNC( INATIVIDADESISTEMA )
{
LASTINPUTINFO lpi;
lpi.cbSize = sizeof (LASTINPUTINFO);
GetLastInputInfo (&lpi);
hb_retnd( ( DOUBLE ) ( GetTickCount() - lpi.dwTime ) / CLOCKS_PER_SEC );
}
#pragma ENDDUMP
Inatividade de Sistema
Enviado: 19 Nov 2020 14:20
por asimoes
Já tinha resolvido com Thread
Código: Selecionar todos
nThread := Hb_ThreadStart( HB_BITOR( HB_THREAD_INHERIT_PUBLIC, ;
HB_THREAD_INHERIT_PRIVATE, ;
HB_THREAD_INHERIT_MEMVARS ), ;
HB_THREAD_MEMVARS_COPY, ;
{ || Inatividade() } )
FUNCTION Inatividade()
THREAD STATIC nSeconds
DO WHILE .T.
IF nSeconds = Nil
nSeconds := Seconds()
ENDIF
IF Round( InatividadeSistema(), 0 ) == 0
nSeconds := Seconds()
ENDIF
IF Seconds() - nSeconds >= 10
nSeconds := Nil
hwg_ExitProcess()
ENDIF
ENDDO
RETURN Nil
Inatividade de Sistema
Enviado: 19 Nov 2020 14:48
por janio
Quanto tempo vc define para sair?
Vc sai da rotina/tela? ou sai do sistema?
Inatividade de Sistema
Enviado: 19 Nov 2020 14:50
por JoséQuintas
Eu estou pensando em remover isso de vez.
Ao usar multithread/multitarefa, com certeza o usuário vai ter várias janelas, e sempre vai ter janela parada.
Criei pra determinadas situações: RunWhileThread()
É ficar executando enquanto outra rotina estiver em aberto.
Usava por exemplo em pedidos, pra avisar de pedidos atrasados.
Ao fechar a rotina de pedidos, também fechava essa rotina.
Inatividade de Sistema
Enviado: 19 Nov 2020 15:05
por asimoes
Eu defino uma inatividade de 8h se o usuário deixar o sistema aberto, e a inatividade atingir 8h o sistema é derrubado
Inatividade de Sistema
Enviado: 19 Nov 2020 20:01
por Itamar M. Lins Jr.
Olá!
Ao usar multithread/multitarefa, com certeza o usuário vai ter várias janelas, e sempre vai ter janela parada.
Não precisa de MT, basta chamar o sistema quantas vezes desejar. O windows é MT, então ele resolve isso.
Nunca me preocupei com isso, derrubar o usuário da rede.
Derruba o servidor; Sem servidor, sem cliente na rede.
Mysql etc devem ter isso também.
No linux eu sei que tem.
Saudações,
Itamar M. Lins Jr.
Inatividade de Sistema
Enviado: 20 Nov 2020 13:50
por asimoes
Usando HwGui
Exemplo de uso:
InatividadeApp( 300 ) // Encerra a aplicação em 5 min caso não tenha nenhuma atividade de teclado/mouse
Código: Selecionar todos
#include "hwgui.ch"
THREAD STATIC ThisForm
FUNCTION InatividadeApp( nTimeOut )
LOCAL oDlg_Wait
Hb_Default(@nTimeOut, 3600) // 1 hora
INIT DIALOG oDlg_Wait ;
TITLE "" ;
AT 0, 0 ;
SIZE 0, 0 ;
FONT HFont():Add( 'Tahoma', 0, -13, 400 ) ;
ON INIT {|This| This:Hide()}
ThisForm := oDlg_Wait
Liga_Timer( oDlg_Wait, .T., 1000, { || Inatividade( nTimeOut ) }, "oTimer" )
ACTIVATE DIALOG oDlg_Wait NOMODAL //SHOW SW_HIDE //ON ACTIVATE { || oDlg_Wait:Hide() }
RETURN oDlg_Wait
STATIC FUNCTION Liga_Timer( oJanela, lLiga, nTime, bBlock, oTimer )
IF lLiga
SET TIMER &oTimer. of oJanela VALUE nTime ACTION bBlock
ELSE
oJanela:&oTimer.:End()
ENDIF
RETURN Nil
STATIC FUNCTION Inatividade( nTimeOut )
THREAD STATIC nSeconds
LOCAL nIntCount
Hb_Default(@nTimeOut, 3600) // 1 hora
IF nSeconds = Nil
nSeconds := Seconds()
ENDIF
nIntCount := Int( PegaInatividade() )
IF nIntCount == 0
nSeconds := Seconds()
ENDIF
IF Seconds() - nSeconds >= nTimeOut
Liga_Timer( ThisForm, .F., , , "oTimer" )
MensagemTimeOut("Encerrando a Aplicação", "Atenção", 10, 4)
hwg_ExitProcess()
ENDIF
RETURN Nil
#pragma BEGINDUMP
#include "windows.h"
#include "time.h"
#include "hbapi.h"
HB_FUNC_STATIC( PEGAINATIVIDADE )
{
LASTINPUTINFO lpi;
lpi.cbSize = sizeof (LASTINPUTINFO);
GetLastInputInfo (&lpi);
hb_retnd( ( DOUBLE ) ( GetTickCount() - lpi.dwTime ) / CLOCKS_PER_SEC );
}
#pragma ENDDUMP
Inatividade de Sistema
Enviado: 20 Nov 2020 13:57
por asimoes
Estou usando isso, porque temos usuários locais e remotos e quando temos uma manutenção de sistema não conseguimos colocar em produção porque tem algum usuário "usando" na verdade a aplicação avisa que precisa sair para atualizar mas tem usuário que deixa o sistema logado ai a rotina corporativa que faz as atualizações finaliza a atualização, agora tem como estabelecer um timeout para inatividade
Inatividade de Sistema
Enviado: 20 Nov 2020 13:59
por asimoes
Itamar M. Lins Jr. escreveu:Não precisa de MT, basta chamar o sistema quantas vezes desejar. O windows é MT, então ele resolve isso.
Nunca me preocupei com isso, derrubar o usuário da rede.
O BD é Oracle não pode ser derrubado.
Inatividade de Sistema
Enviado: 20 Nov 2020 22:58
por asimoes
* 2 formas de fazer Hide da janela, pode também colocar no ON INIT da Dialog
1-
ACTIVATE DIALOG oDlg_Wait NOMODAL SHOW SW_HIDE
2-
ACTIVATE DIALOG oDlg_Wait NOMODAL ON ACTIVATE { || oDlg_Wait:Hide() }
Pode ser usado para outras finalidades como execução fantasma na aplicação
* Não usar style