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.

Código: Selecionar todos

net stop letodbf_service
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
INATIVIDADEAPP.PRG
(1.65 KiB) Baixado 148 vezes
MESSAGEBOX.PRG
(10.37 KiB) Baixado 179 vezes

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