Encerrar Programa após um tempo de inatividade

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

ssflavio
Usuário Nível 2
Usuário Nível 2
Mensagens: 86
Registrado em: 10 Jul 2008 09:57
Localização: São Paulo / SP

Encerrar Programa após um tempo de inatividade

Mensagem por ssflavio »

Boa tarde amigos!
Tem como encerrar uma aplicação escrita em Harbour console após um tempo sem usar o teclado?
Flávio dos Santos Szelbracikowski
ssflavio@osite.com.br
paiva
Usuário Nível 3
Usuário Nível 3
Mensagens: 300
Registrado em: 04 Ago 2005 10:28

Encerrar Programa após um tempo de inatividade

Mensagem 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
Editado pela última vez por Itamar M. Lins Jr. em 15 Set 2021 20:35, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Encerrar Programa após um tempo de inatividade

Mensagem 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).
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
ssflavio
Usuário Nível 2
Usuário Nível 2
Mensagens: 86
Registrado em: 10 Jul 2008 09:57
Localização: São Paulo / SP

Encerrar Programa após um tempo de inatividade

Mensagem por ssflavio »

obrigado pelo apoio!
essas soluções são bem CLIPPER, será que o Harbour não teria uma solução melhor?
Flávio dos Santos Szelbracikowski
ssflavio@osite.com.br
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Encerrar Programa após um tempo de inatividade

Mensagem 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.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
ssflavio
Usuário Nível 2
Usuário Nível 2
Mensagens: 86
Registrado em: 10 Jul 2008 09:57
Localização: São Paulo / SP

Encerrar Programa após um tempo de inatividade

Mensagem por ssflavio »

Paiva, pensando bem, como voce alterou o getsys no harbour?
dessa forma acho que eu conseguiria implementar no meu sistema
Flávio dos Santos Szelbracikowski
ssflavio@osite.com.br
paiva
Usuário Nível 3
Usuário Nível 3
Mensagens: 300
Registrado em: 04 Ago 2005 10:28

Encerrar Programa após um tempo de inatividade

Mensagem 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
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Encerrar Programa após um tempo de inatividade

Mensagem 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
//-----------------------------------------------------------------------------------------
[]´s
Alexandre Santos (AlxSts)
ssflavio
Usuário Nível 2
Usuário Nível 2
Mensagens: 86
Registrado em: 10 Jul 2008 09:57
Localização: São Paulo / SP

Encerrar Programa após um tempo de inatividade

Mensagem 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!!!
Flávio dos Santos Szelbracikowski
ssflavio@osite.com.br
Avatar do usuário
Nascimento
Usuário Nível 4
Usuário Nível 4
Mensagens: 763
Registrado em: 19 Jul 2008 12:11
Localização: OLINDA-PE

Encerrar Programa após um tempo de inatividade

Mensagem por Nascimento »

tambem tem da hbct

keysec(27,80,,.T.) // tecla, tempo , falso ou verdadeiro
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Encerrar Programa após um tempo de inatividade

Mensagem 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.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
ssflavio
Usuário Nível 2
Usuário Nível 2
Mensagens: 86
Registrado em: 10 Jul 2008 09:57
Localização: São Paulo / SP

Encerrar Programa após um tempo de inatividade

Mensagem 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
Flávio dos Santos Szelbracikowski
ssflavio@osite.com.br
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Encerrar Programa após um tempo de inatividade

Mensagem 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.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Encerrar Programa após um tempo de inatividade

Mensagem 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.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Encerrar Programa após um tempo de inatividade

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Responder