Clipper On Line • Ver Tópico - Encerrar Programa após um tempo de inatividade

Encerrar Programa após um tempo de inatividade

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

Moderador: Moderadores

 

Encerrar Programa após um tempo de inatividade

Mensagempor ssflavio » 13 Set 2021 17:24

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
ssflavio
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 80
Data de registro: 10 Jul 2008 09:57
Cidade/Estado: São Paulo / SP
Curtiu: 3 vezes
Mens.Curtidas: 3 vezes

Encerrar Programa após um tempo de inatividade

Mensagempor paiva » 13 Set 2021 19:33

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

//----------------------------------------------------------------------------//
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
Nota de Moderação:
Itamar M. Lins Jr.: Mensagem editada para colocar a tag [ code ]
Veja como utilizar esta tag: Clique aqui
paiva
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 113
Data de registro: 04 Ago 2005 10:28
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

Encerrar Programa após um tempo de inatividade

Mensagempor JoséQuintas » 14 Set 2021 14:19

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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 17601
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 956 vezes

Encerrar Programa após um tempo de inatividade

Mensagempor ssflavio » 14 Set 2021 15:25

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
ssflavio
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 80
Data de registro: 10 Jul 2008 09:57
Cidade/Estado: São Paulo / SP
Curtiu: 3 vezes
Mens.Curtidas: 3 vezes

Encerrar Programa após um tempo de inatividade

Mensagempor Jairo Maia » 14 Set 2021 16:10

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):

//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)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2615
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 344 vezes
Mens.Curtidas: 288 vezes

Encerrar Programa após um tempo de inatividade

Mensagempor ssflavio » 14 Set 2021 17:54

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
ssflavio
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 80
Data de registro: 10 Jul 2008 09:57
Cidade/Estado: São Paulo / SP
Curtiu: 3 vezes
Mens.Curtidas: 3 vezes

Encerrar Programa após um tempo de inatividade

Mensagempor paiva » 14 Set 2021 19:18

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
paiva
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 113
Data de registro: 04 Ago 2005 10:28
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

Encerrar Programa após um tempo de inatividade

Mensagempor alxsts » 14 Set 2021 19:20

Olá!

Segue outra opção, que dispensa alterar o GetSys:
// 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)
alxsts
Colaborador

Colaborador
 
Mensagens: 2598
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 15 vezes
Mens.Curtidas: 191 vezes

Encerrar Programa após um tempo de inatividade

Mensagempor ssflavio » 14 Set 2021 19:23

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):

//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
ssflavio
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 80
Data de registro: 10 Jul 2008 09:57
Cidade/Estado: São Paulo / SP
Curtiu: 3 vezes
Mens.Curtidas: 3 vezes

Encerrar Programa após um tempo de inatividade

Mensagempor Nascimento » 15 Set 2021 12:34

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 de usuário

Nascimento
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 668
Data de registro: 19 Jul 2008 12:11
Cidade/Estado: OLINDA-PE
Curtiu: 103 vezes
Mens.Curtidas: 69 vezes

Encerrar Programa após um tempo de inatividade

Mensagempor Jairo Maia » 15 Set 2021 13:12

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)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2615
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 344 vezes
Mens.Curtidas: 288 vezes

Encerrar Programa após um tempo de inatividade

Mensagempor ssflavio » 15 Set 2021 17:36

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):

//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
ssflavio
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 80
Data de registro: 10 Jul 2008 09:57
Cidade/Estado: São Paulo / SP
Curtiu: 3 vezes
Mens.Curtidas: 3 vezes

Encerrar Programa após um tempo de inatividade

Mensagempor Jairo Maia » 15 Set 2021 17:53

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)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2615
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 344 vezes
Mens.Curtidas: 288 vezes

Encerrar Programa após um tempo de inatividade

Mensagempor alxsts » 15 Set 2021 17:54

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)
alxsts
Colaborador

Colaborador
 
Mensagens: 2598
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 15 vezes
Mens.Curtidas: 191 vezes

Encerrar Programa após um tempo de inatividade

Mensagempor Itamar M. Lins Jr. » 15 Set 2021 20:32

Olá!
   nTask2 := HB_IdleAdd( {|| If( Secs( Elaptime( nTimeSleep, Time() ) ) > nTimeWait, {|| DbCloseall(),  minhafunção(...), etc,__Quit() }, "" ) } )


Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 5556
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 205 vezes
Mens.Curtidas: 323 vezes




Retornar para Harbour

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 11 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro