Página 1 de 1

Encerrar Programa após um tempo de inatividade

Enviado: 13 Set 2021 17:24
por ssflavio
Boa tarde amigos!
Tem como encerrar uma aplicação escrita em Harbour console após um tempo sem usar o teclado?

Encerrar Programa após um tempo de inatividade

Enviado: 13 Set 2021 19:33
por paiva
eu uso xhb

controlo uma variavel setando com o Time

la funcao Get no menu etc

funio

na ok


Paiva

WVW_SETTIMER(0,1000*60*60*val(tinte_12)) && 1.000 = 1 seg x 60 = 1 Minuto x 05 = a cada X horas, Verifica

Código: Selecionar todos

//----------------------------------------------------------------------------//
FUNCTION WVW_TIMER( nWindow, hWnd, message, wParam, lParam )

xtime_atual_n = F_TtoS(time())
xtime_anter_n = F_TtoS(p_t_time)

x_derruba = .f.
xtempo_dd = (date() - p_t_date )

* tinte_12   && Pag 21
do case

   case  xtempo_dd = 0    && no mesmo dia

         xtime_dif = xtime_atual_n - xtime_anter_n
         if  val(tinte_12) > 3
             if  xtime_dif > val(tinte_12) * 60
                 x_derruba = .T.
             endif
         else
             if  xtime_dif > val(tinte_12) * 60 * 60
                 x_derruba = .T.
             endif
         endif

   case  xtempo_dd = 1    && no       dia seguinte
         xtime_dif = (xtime_atual_n + (24*60*60) ) - xtime_anter_n

         if  val(tinte_12) > 3
             if  xtime_dif > val(tinte_12) * 60
                 x_derruba = .T.
             endif
         else
             if  xtime_dif > val(tinte_12) * 60 * 60
                 x_derruba = .T.
             endif
         endif

   otherwise
         x_derruba = .T.
endcase

if  x_derruba = .T.
    set device to screen
    set color to &pvermelho
    clear

    @ 05,02 say "                     Por Motivo de SEGURANCA...                       "
    @ 08,02 say "Por estar PARADO mais de "+tinte_12+" Minutos, O sistema FOI DESATIVADO. "
    @ 12,02 say "Caso Precise, Chame NOVAMENTE o Sistema e EVITE Deixa-lo Parado. "

    pmostra_erro = [N]
    _finaliza()

     x_re_indexou = memoread('\dbdc\reindex.txt')
     x_re_indexou = x_re_indexou + CHR(13)+CHR(10)
     x_re_indexou = x_re_indexou + [TIME Parado mais de ]+tinte_12+" Minutos, O sistema FOI DESATIVADO. " +dtoc(date())+[  Hora: ]+time()+[  Usu: ]+pusuario
     MemoWrit( '\dbdc\reindex.txt', x_re_indexou )

    close databases
    pmostra_erro = [N]
    quit
    quit

endif

RETURN

Encerrar Programa após um tempo de inatividade

Enviado: 14 Set 2021 14:19
por JoséQuintas
Eu uso Inkey(600) por exemplo, e se retornar ZERO, é porque ninguém teclou nada.
Mas isso exige mexer na GETSYS, e em outros lugares.
Em caso de retornar 0, aciono um KEYBOARD Chr(K_ESC).

Encerrar Programa após um tempo de inatividade

Enviado: 14 Set 2021 15:25
por ssflavio
obrigado pelo apoio!
essas soluções são bem CLIPPER, será que o Harbour não teria uma solução melhor?

Encerrar Programa após um tempo de inatividade

Enviado: 14 Set 2021 16:10
por Jairo Maia
ssflavio escreveu:será que o Harbour não teria uma solução melhor?
Em Harbour, você pode usar dessa forma (coloque no início do sistema):

Código: Selecionar todos

//SET EVENTMASK TO INKEY_ALL  // Se usa mouse, descomente essa linha para NextKey() pegar eventos do mouse

nTimeWait := 30       // Defina aqui o Tempo em segundos
nTimeSleep := Time()  // Inicia valor da variável de controle

nTask1 := HB_IdleAdd( {|| nTimeSleep := If( NextKey() > 0, Time(), nTimeSleep ) } )
nTask2 := HB_IdleAdd( {|| If( Secs( Elaptime( nTimeSleep, Time() ) ) > nTimeWait, __Quit(), "" ) } )
As variáveis nTask1 e nTask2 você pode suprimir nesse caso, já que serão automaticamente fechadas as Tasks (Tarefas) ao encerrar o sistema.

Se for usar HB_IdleAdd() de forma diferente, precisa fechar os handlers após executar a tarefa usando: HB_IdleDel( nTask1 ), HB_IdleDel( nTask2 ), etc...

NOTA: Defina na variável nTimeWait o tempo de espera desejado em Segundos.

Encerrar Programa após um tempo de inatividade

Enviado: 14 Set 2021 17:54
por ssflavio
Paiva, pensando bem, como voce alterou o getsys no harbour?
dessa forma acho que eu conseguiria implementar no meu sistema

Encerrar Programa após um tempo de inatividade

Enviado: 14 Set 2021 19:18
por paiva
EU ainda uso a wvw

então eu troquei em todos os prg o read por Wread(Janela)

e criei uma função Wread

nela eu faço alguma coisa da WVW e tem dentro dela um READ rs

posso mandar a funcao wread caso precise ai teria que tirar os comandos wvw + é simples

cpaivasistemas@gmail.com

skyper Paiva_sistemas

Encerrar Programa após um tempo de inatividade

Enviado: 14 Set 2021 19:20
por alxsts
Olá!

Segue outra opção, que dispensa alterar o GetSys:

Código: Selecionar todos

// Alexandre Santos

#include "inkey.ch"

PROCEDURE Main
   LOCAL pTask, aVar := AFill( Array( 3 ), Space(10 ) )
   LOCAL nWaitSeconds := 3000, lTimeOut := .F., GetList := {}

   Set( _SET_EVENTMASK, INKEY_ALL )
   CLS

   pTask := HB_IdleAdd( { || lTimeOut := Timer( nWaitSeconds, GetActive(), pTask ) } )

   @ 10,10 say 'Campo 1' get aVar[ 1 ]
   @ 11,10 say 'Campo 2' get aVar[ 2 ]
   @ 12,10 say 'Campo 3' get aVar[ 3 ]

   Read

   If lTimeOut
      Alert( "Tempo esgotado. Encerrando..." )   
   Endif

RETURN
//-----------------------------------------------------------------------------------------

FUNCTION Timer( nLimit, oGet, pTask )

   STATIC nMiliSec
   LOCAL  lTimeOut := .F.
   
   If Empty( nMiliSec )
      nMiliSec := If( Empty( nLimit ), 10000, nLimit )
   Endif

   While ( nMiliSec > 0 .And. NextKey() == 0 )
         Hb_IdleSleep( .1 )
         nMiliSec -= 100
   Enddo

   If nMiliSec <= 0
      If Valtype( oGet ) == "O"
         ReadKill( .T. )
      Endif

      lTimeOut := .T.
      HB_IdleDel( pTask )
      Hb_KeyPut( K_ENTER )
   Else
      nMiliSec := nLimit
   Endif

RETURN lTimeOut
//-----------------------------------------------------------------------------------------

Encerrar Programa após um tempo de inatividade

Enviado: 14 Set 2021 19:23
por ssflavio
Jairo Maia escreveu:
ssflavio escreveu:será que o Harbour não teria uma solução melhor?
Em Harbour, você pode usar dessa forma (coloque no início do sistema):

Código: Selecionar todos

//SET EVENTMASK TO INKEY_ALL  // Se usa mouse, descomente essa linha para NextKey() pegar eventos do mouse

nTimeWait := 30       // Defina aqui o Tempo em segundos
nTimeSleep := Time()  // Inicia valor da variável de controle

nTask1 := HB_IdleAdd( {|| nTimeSleep := If( NextKey() > 0, Time(), nTimeSleep ) } )
nTask2 := HB_IdleAdd( {|| If( Secs( Elaptime( nTimeSleep, Time() ) ) > nTimeWait, __Quit(), "" ) } )
As variáveis nTask1 e nTask2 você pode suprimir nesse caso, já que serão automaticamente fechadas as Tasks (Tarefas) ao encerrar o sistema.

Se for usar HB_IdleAdd() de forma diferente, precisa fechar os handlers após executar a tarefa usando: HB_IdleDel( nTask1 ), HB_IdleDel( nTask2 ), etc...

NOTA: Defina na variável nTimeWait o tempo de espera desejado em Segundos.
muito obrigado Jairo!
não acreditei que funcionou!
4 linhas apenas!
GRATIDÃO!!!

Encerrar Programa após um tempo de inatividade

Enviado: 15 Set 2021 12:34
por Nascimento
tambem tem da hbct

keysec(27,80,,.T.) // tecla, tempo , falso ou verdadeiro

Encerrar Programa após um tempo de inatividade

Enviado: 15 Set 2021 13:12
por Jairo Maia
Nascimento escreveu:keysec(27,80,,.T.) // tecla, tempo , falso ou verdadeiro
Sim. Mas a KeySec() não funciona para fechar um sistema.

Sintaxe: KeySec( <nKey>, <nTime>, [<nCounter>], [<lMode>] )

Onde obrigatório:
<nKey> = Tecla a ser inserida no Buffer do teclado
<nTime> = Tempo a esperar para inserir a tecla

Onde opcional:
[<nCounter>] = Número de vezes a colocar a tecla no Buffer do teclado (se omitido, o padrão é 1 vez)
[<lMode>] = Se colocar .T., o tempo é resetado ao teclar algo (se omitido, o padrão é .F., ou seja não reseta)

Ocorre que se o usuário abriu 2 ou 3 telas após iniciar o sistema, e ESC retorna a função anterior, então se configurar para 30 minutos colocar um ESC, o sistema será fechado somente após 60 ou 90 minutos. Não funciona para o intento do autor do tópico.

Retorno de KeySec(): Retorna .T. enquanto o tempo estiver dentro do determinado, e retorna .F. se o tempo for esgotado, ou se o quarto parâmetro for .T., retorna .F. ao teclar algo e resetar o tempo.

Para desativar KeySec(): Colocar sem parâmetros, ou seja, apenas: KeySec() e desativa.

Encerrar Programa após um tempo de inatividade

Enviado: 15 Set 2021 17:36
por ssflavio
Jairo Maia escreveu:
ssflavio escreveu:será que o Harbour não teria uma solução melhor?
Em Harbour, você pode usar dessa forma (coloque no início do sistema):

Código: Selecionar todos

//SET EVENTMASK TO INKEY_ALL  // Se usa mouse, descomente essa linha para NextKey() pegar eventos do mouse

nTimeWait := 30       // Defina aqui o Tempo em segundos
nTimeSleep := Time()  // Inicia valor da variável de controle

nTask1 := HB_IdleAdd( {|| nTimeSleep := If( NextKey() > 0, Time(), nTimeSleep ) } )
nTask2 := HB_IdleAdd( {|| If( Secs( Elaptime( nTimeSleep, Time() ) ) > nTimeWait, __Quit(), "" ) } )
As variáveis nTask1 e nTask2 você pode suprimir nesse caso, já que serão automaticamente fechadas as Tasks (Tarefas) ao encerrar o sistema.

Se for usar HB_IdleAdd() de forma diferente, precisa fechar os handlers após executar a tarefa usando: HB_IdleDel( nTask1 ), HB_IdleDel( nTask2 ), etc...

NOTA: Defina na variável nTimeWait o tempo de espera desejado em Segundos.
Fiquei com uma dúvida Jairo,
Ao fechar o sistema, ele fecha todos os arquivos primeiro?
é seguro para os índices? Eu uso .NTX

Encerrar Programa após um tempo de inatividade

Enviado: 15 Set 2021 17:53
por Jairo Maia
ssflavio escreveu:Ao fechar o sistema, ele fecha todos os arquivos primeiro?
Sim! Veja que a função é encerrada com a função __Quit().

A função __Quit() Salva todos registros pendentes, fecha todos arquivos abertos e eventuais handlers (controladores) de arquivos, tarefas ou funções "de baixo nível", e encerra o sistema de forma incondicional.

Se você usa uma EXIT PROCEDURE <NameExitProcedure>, ela será executada antes de ser fechado o sistema.

Encerrar Programa após um tempo de inatividade

Enviado: 15 Set 2021 17:54
por alxsts
Olá!
QUIT
Terminates program execution unconditionally.
Syntax
QUIT

Description
The QUIT command terminates program execution unconditionally. Before control goes back to the operating system, all files are closed and all EXIT PROCEDURES are executed, unless a runtime error occurs during program shutdown. In this case, the ErrorLevel() function is set to 1 which is the applications's return code to the operating system.
Como escrito acima, fecha todos os arquivos abertos e executa uma EXIT PROCEDURE, caso haja, desde que não haja nenhum erro de execução. Mas nada impede de, ao invés de dar Quit (ou __Quit() ), desviar para uma rotina que execute os procedimentos de finalização.

Encerrar Programa após um tempo de inatividade

Enviado: 15 Set 2021 20:32
por Itamar M. Lins Jr.
Olá!

Código: Selecionar todos

	nTask2 := HB_IdleAdd( {|| If( Secs( Elaptime( nTimeSleep, Time() ) ) > nTimeWait, {|| DbCloseall(),  minhafunção(...), etc,__Quit() }, "" ) } )
Saudações,
Itamar M. Lins Jr.