Página 1 de 3

encerrar programa apos <n> Tempo ocioso????

Enviado: 27 Mai 2008 04:06
por adilson
Bom Dia Pessoal !

Existe Alguma Forma de Encerrar o Programa apos ficar o mesmo <N> tempo sem Uso ???


obrigado ...

Enviado: 27 Mai 2008 04:48
por Maligno
O principal é você conseguir descobrir SE o sistema está ocioso. Nativamente o Clipper não tem como informar isso. Mas há um truque simples: usando uma função de leitura de teclado diferente de InKey(). Seria uma função sua, chamada de GetKey(), por exemplo. Nela você chama InKey(), mas antes faz o controle de tempo. Passado o tempo configurado, você encerra o programa. Caso contrário, havendo alguma atividade de teclado, você recicla e recomeça a contar.

O problema maior é que InKey() é chamada internamente por funções as quais você não tem acesso. Logo, esse truque não é o ideal, não é perfeito, mas pode servir relativamente bem ao propósito.

encerrar programa apos <n> Tempo ocioso

Enviado: 27 Mai 2008 08:35
por Pablo César
Isso mesmo Maligno. Eu por exemplo para ver se está ocioso o meu sistema, faço passar logo no inicio de execução, por uma rotina de configuração de ambiente na qual incluo a função KEYSEC da CT.LIB que serve para verificar a inatividade do teclado. Eu utilizo meu sistemas de menus baseados no INKEY() e executo determinadas rotinas conforme o retorno do INKEY através de DO CASEs. Daí então atribuo o retorno da função KEYSEC a uma tecla que não é utilizada nos menus, por exemplo CH(255) ficando: KEYSEC(CHR(255),<tempo_em_segundos>,-1,.T.). E quando acionada determinada tecla (como neste caso CHR(255)) possa acionar a chamada de um protetor de tela.

Lembrando que na versão 5.3 do Clipper, o INKEY() tem um segundo parâmetro que pode ser utilizado, que é para verificar os eventos do teclado e/ou mouse. Isto permite que qualquer ação que ocorra possa permitir a saída de um protetor de tela, ficando desta maneira a sua saída:

Código: Selecionar todos

IF INKEY(<temporização>,159)>0
   KEYBOARD CHR(255)
   EXIT
ENDIF
Outra medida, um tanto radical, é inserir no GETSYS.PRG a temporização para saída de cada GET. Quando falo em temporização é a quantidade de segundos que o sistema deve esperar e isso eu deixo que o usuário configure, mas disponibilizo essa configuração em minutos.

Re: encerrar programa apos <n> Tempo ocioso????

Enviado: 27 Mai 2008 13:13
por ANDRIL
Outra opção é utilizar a EVEN.LIB para ativar uma função de controle de 2o.plano. Crie uma função que fique monitorando o teclado, se nao tiver uso (inkey()=0) dispara um contador durante um certo tempo, se nao voltar ao uso ao fim da contagem, encerra o programa.

Usei esta lib para execução de screensave, inicialmente usava a KEYSEC da CTP.LIB, devido a problema quando havia calculos longo no sistema (dava erro), migrei para EVEN.LIB

É apenas mais uma opção... basta escolher.

Ate+

EVEN.LIB

Enviado: 27 Mai 2008 13:22
por Pablo César
Andril, esta biblioteca é da BGEVENTS ? Qual seria a função que deixa uma função em segundo plano ? Poderias dar exemplos ?

Re: encerrar programa apos <n> Tempo ocioso????

Enviado: 27 Mai 2008 13:59
por ANDRIL
Andril, esta biblioteca é da BGEVENTS ?
R: Sim

Qual seria a função que deixa uma função em segundo plano ?

Código: Selecionar todos

Function MAIN()
Define backgroundevent Action gereimpre() Name "UdfClock1" interval 2.00
return
Neste caso GEREIMPRE() é minha função que tem um contador. A cada intervalo de 2 minutos ela repete a função. Quando a funcao é executada ela reinicia o contador, a funcao fica em loop ate que seja teclado um INKEY() diferente de ZERO.

Tentei localizar a funções porem ainda nao encontrei aqui nos meus diretorios... qtos prgs... mais em suma, é só criar um loop e que saia apenas qdo alguma tecla # de zero seja utilizada reiniciando o contador.

Se nao me engano ao baixar a BGEVENTS ha alguns exemplos, ou nem me lembro como cheguei nesta função.

Qualquer dúvida, tamos aí, ok!

BGEVENTS

Enviado: 27 Mai 2008 14:17
por Pablo César
Não ficou ainda claro sua exemplificação. Entendo que ficou te faltando a documentação da BGEVENTS (eu também não possuo). Mas não entendí porquê você uso a função MAIN ja que supõe-se o uso do backgroundevent é uma directiva do BGEVENTS.CH, agora caberia ver seu exemplo quando encontres o PRG que utiliza o backgroundevent (não precisa ser para agora, mas seria interessante saber como é feito).

Obs.: Andril, para obter sucesso na sua procura desse exemplo, procure todo PRG que utilize o INCLUDE bgevents.ch.

Re: encerrar programa apos <n> Tempo ocioso????

Enviado: 27 Mai 2008 16:05
por ANDRIL
Plabo, usei o nome MAIN para a funcao que chama a declaração, porem pode ser qualquer nome para a função.

O importante é que tenha uma função para chamar a especificação DEFINE (q é diferente da #DEFINE) do clipper, se nao tiver em uma função, durante a compilação já informará erro, se não me falha a memoria, era uma informação da própria lib.

Tentei citar um exemplo salve-os e teste.

Clipper teste
rtlink ou blinker fi teste lib EVEN

ok.

Código: Selecionar todos

 PROCEDURE TESTE
set date brit
set cent on
set dele on
* esta funcao chama o evento
monitora()

* abra seu banco de dados
use SEUBANCO
dbedit(03,00,23,79)

QUIT

Código: Selecionar todos

Function MONITORA
Define backgroundevent Action SSAVEPRG() Name "UdfClock1" interval 1
return

Código: Selecionar todos

PROC SSAVEPRG
static ssave

      IF ssave == NIL
           ssave:=1
      ENDIF
      if ssave=10 
            * 10 é o tempo de ociosidade pois se ficar 10 seg sem usar o teclado 
            * executa a sua função
            Wait"Aqui coloque sua função para encerramento do sistema"       
            keyb chr(0)
            ssave:=1
      endif
      * esta linha é apenas para exibir o contador durante o teste
      * pode ser retirada
      @24,01 say ssave
      ssave++
if lastkey()#0
keyb chr(0)
ssave:=1
endif
return ssave

Agora fiquei em dúvida se eu alterei o nome da BGEVENTS.LIB para EVEN.LIB ou existe realmente esta EVEN.LIB.

ate+

EVEN.LIB

Enviado: 27 Mai 2008 16:26
por Pablo César
ANDRIL escreveu:O importante é que tenha uma função para chamar a especificação DEFINE (q é diferente da #DEFINE) do clipper, se nao tiver em uma função, durante a compilação já informará erro, se não me falha a memoria, era uma informação da própria lib.
Pode até ser, mas ainda acho que é necessário ser colocado o #Include "BGEVENTS.CH" para que tenha efeito.

Peguei todo o seu código exemplo e adicionei o include para poder compilar, pois do contrário dá erro: Error C2001 Syntax error: 'BACKGROUNDEVENT' olhe como ficou:

Código: Selecionar todos

#Include "BGEVENTS.CH"

set date brit
set cent on
set dele on
* esta funcao chama o evento 

monitora()

* abra seu banco de dados
use CLIENTES
dbedit(03,00,23,79)

Function MONITORA
Define backgroundevent Action SSAVEPRG() Name "UdfClock1" interval 1
return

PROC SSAVEPRG
static ssave

IF ssave == NIL
     ssave:=1
ENDIF
if ssave=10
      * 10 é o tempo de ociosidade pois se ficar 10 seg sem usar o teclado
      * executa a sua função
      Wait"Aqui coloque sua função para encerramento do sistema"
      keyb chr(0)
      ssave:=1
endif
* esta linha é apenas para exibir o contador durante o teste
* pode ser retirada
@24,01 say ssave
ssave++
if lastkey()#0
   keyb chr(0)
   ssave:=1
endif
return ssave
Compilei com clipper 5.2E + RTLINK + EVEN.LIB, executei e exibiu meu CLIENTES.DBF e mostrou os 10 segundos em que ocorreria uma interrupção. Funcionou.
Agora fiquei em dúvida se eu alterei o nome da BGEVENTS.LIB para EVEN.LIB ou existe realmente esta EVEN.LIB
Eu acho que o EVEN.LIB é a própria biblioteca, pois eu não possuo BGEVENTS.LIB alguma. Obrigado Andril.

Enviado: 27 Mai 2008 16:51
por Maligno
Há uma biblioteca chamada BGEvents no site "The Oasis". Deve ser essa sobre a qual discutem. Peguem ela completa neste site.

Enviado: 27 Mai 2008 17:04
por Maligno

Enviado: 27 Mai 2008 17:06
por Maligno
Esqueci que também tinha carregado no meu site. Até vou tirar. De qualquer forma, o link pra ele (por enquanto) é http://pub.buzinello.com/xbase/clipper/ ... nts_v5.zip

EDITADO: Acabei de remover do meu site. Quem quiser, terá de pegar do site "The Oasis". Link acima.

EVEN.LIB

Enviado: 27 Mai 2008 17:07
por Pablo César
Neste também não possui o EVEN.LIB

Enviado: 27 Mai 2008 17:08
por Maligno
Será que a LIB não foi renomeada? Comparou os tamanhos?

Re: encerrar programa apos <n> Tempo ocioso????

Enviado: 27 Mai 2008 17:21
por ANDRIL
Realmente Pablo esqueci de mencionar no exemplo a inclusão do BGEVENTS.CH
me desculpe.

Quanto a BGEVENTS.LIB nao tenho ela aqui, por isso disse que talvez tivesse renomeado para EVEN.LIB

Ate+