Função FT_Ontick()

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

Moderador: Moderadores

Josmar dos Santos
Usuário Nível 3
Usuário Nível 3
Mensagens: 277
Registrado em: 11 Jan 2006 18:36
Localização: Botucatu-SP

Função FT_Ontick()

Mensagem por Josmar dos Santos »

Boa tarde. Essa função FT_Ontick() consegue mesmo fazer com que o programa após n tempo de ociosidade saía sem o usuário dar o comando? Achei essa função e gostaria que alguém aqui do fórum me ajudasse a entender ela e implementar no meu sistema..

Código: Selecionar todos

 THREAD STATIC t_bOnTick
THREAD STATIC t_nTickInterval := 0
THREAD STATIC t_nLastCheck := 0
THREAD STATIC t_hIdle
	 
STATIC PROCEDURE __ft_OnTick()
	 
IF hb_MilliSeconds() >= ( t_nLastCheck + t_nTickInterval )
   t_nLastCheck := hb_MilliSeconds()
   Eval( t_bOnTick )
ENDIF
RETURN
	 
PROCEDURE ft_OnTick( bOnTick, nTckInterval ) 
	 	   
IF HB_ISEVALITEM( bOnTick )
   t_bOnTick := bOnTick
   IF HB_ISNUMERIC( nTickInterval )
      t_nTickInterval := ( 1 / 18.20648 ) * nTickInterval * 1000
   ENDIF
t_nLastCheck := hb_MilliSeconds()
   IF Empty( t_hIdle )
      t_hIdle := hb_idleAdd( {|| __ft_OnTick() } )
   ENDIF
ELSE
t_bOnTick := NIL
  t_nTickInterval := 0
  IF ! Empty( t_hIdle )
     hb_idleDel( t_hIdle )
     t_hIdle := NIL
  ENDIF
ENDIF
RETURN   
Josmar
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Função FT_Ontick()

Mensagem por Itamar M. Lins Jr. »

Já testou ai, para ver se funciona ?

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Função FT_Ontick()

Mensagem por Itamar M. Lins Jr. »

Teste ai:

Código: Selecionar todos

/* Copyright 2011 Viktor Szakats (vszakats.net/harbour) */

#require "hbnf"

PROCEDURE Main()

   ft_OnTick( {|| QOut( hb_MilliSeconds() ) } )

   Inkey( 0 )

   ft_OnTick( {|| QOut( hb_MilliSeconds() ) }, 18 )

   Inkey( 0 )

   ft_OnTick()

   Inkey( 0 )

   RETURN
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Função FT_Ontick()

Mensagem por Eolo »

Eu uso KEYSEC() em meus sistemas, em cada ponto de parada. É simples e funciona.

Se o usuário for pra casa e deixar o sistema aberto, mesmo que seja 10 níveis abaixo, cada rotina vai sendo retornada ao nível superior até terminar por completo.

Exemplo:

Código: Selecionar todos

keysec(27,60,,.T.)
inkey(0)
keysec()
if lastkey()=27
  retu
endi
Se o usuário não teclar nada em 60 segundos, é gerado um ESC (chr27), que faz terminar o Inkey(0). Lastkey(), então, retorna 27.
Se ele teclar alguma coisa, o temporizador é desligado e Lastkey() retorna o que foi teclado.

Keysec(), sem argumentos, desliga o temporizador.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Função FT_Ontick()

Mensagem por Itamar M. Lins Jr. »

Ola!

Código: Selecionar todos

 FT_ONTICK()
 Evaluate a designated code block at a designated interval.
------------------------------------------------------------------------------

 Syntax

      FT_OnTick( bCode, nInterval )

 Arguments

     <bCode> is the code block to evaluate.
     <nInterval> is the number of clock ticks to wait between
                 evaluations of the code block.

 Returns

     NIL

 Description

     This function effectively allows you to run tasks in the background
     by transparently and periodically calling a designated routine.

     To halt the execution of the background function, call FT_OnTick()
     with no arguments.

     This function makes heavy use of several undocumented internal
     routines.  If this fact makes you uncomfortable then don't use
     this function, you quivering sack of cowardly slime.

 Examples


     // Set up a self-updating on-screen clock

     FT_OnTick( "CLOCK", 9 )

     procedure Clock

     local nRow := Row()
     local nCol := Col()

     @ 0, 0 say Time()

     SetPos( nRow, nCol )

     return
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Josmar dos Santos
Usuário Nível 3
Usuário Nível 3
Mensagens: 277
Registrado em: 11 Jan 2006 18:36
Localização: Botucatu-SP

Função FT_Ontick()

Mensagem por Josmar dos Santos »

Boa tarde Itamar, eu testei sim a primeira rotina que enviei e deu esse erro:

Código: Selecionar todos

 Error E0004 STATIC declaration follows executable statement 
Quanto a rotina que vc me pediu para testar, eu testei, mas tive que tirar a PROCEDURE MAIN(), Estava dando conflito com a FUNCTION MAIN() do Harbour. Coloquei só os outros comandos abaixo do mesmo. Ele compilou, mas ao executar o comando para entrar no sistema ele começa a listar os milissegundos, após teclar uma tecla, ele conta os segundos, após outra, da pause e na última ele sai do sistema. Eu coloquei no prg principal.

Eolo...não esqueci de vc...estou testando a sua rotina também.


Josmar
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Função FT_Ontick()

Mensagem por Itamar M. Lins Jr. »

Ola!
Se vc observar bem a função FT_ONTICK() e KEYSEC() são equivalentes. Tanto faz usar uma como outra, só não funciona em modo gráfico.
Uma precisa da lib hbnf e a outra da hbct.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Josmar dos Santos
Usuário Nível 3
Usuário Nível 3
Mensagens: 277
Registrado em: 11 Jan 2006 18:36
Localização: Botucatu-SP

Função FT_Ontick()

Mensagem por Josmar dos Santos »

Itamar, gostaria se possível que vc me explicasse como vou conseguir implementar essa função no meu sistema. Por que como eu disse acima: Ela gera toda quela lista de contagem, mas como fazer rodar agora sem aparecer aquela listagem??

Josmar
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Função FT_Ontick()

Mensagem por Itamar M. Lins Jr. »

Leia e releia o manual até entender. Eu faço assim para entender.

Código: Selecionar todos

keysec(27,60,,.T.)
inkey(0)
keysec()
if lastkey()=27
 return
endif

Ou 

ft_ontick({||hb_keyPuT(chr(27))},18) //vai executar isso o tempo todo, a cada x segundos!!
inkey(0)
ft_ontick() //assim puro desliga!

ft_ontick({||SuaFuncao()},18}
....get, get, get...
Read
ft_ontick() //assim puro desliga!

Function SuaFuncao
//faço o que ?
If empty(Inkey()) ///nao teclou nada durante x segundos nem usou o mouse!
   keyboard chr(27)
endif

If lastkey() == K_ESC
//faz isso
ElseIf lastkey != K_ESC 
//faz aquilo
EndIf


É melhor usar a função KeySec()
Tem outras aqui no forum mais completas.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Josmar dos Santos
Usuário Nível 3
Usuário Nível 3
Mensagens: 277
Registrado em: 11 Jan 2006 18:36
Localização: Botucatu-SP

Função FT_Ontick()

Mensagem por Josmar dos Santos »

Itamar, bom dia. Só uma explicação: Antes de postar algum tópico eu sempre procuro ao máximo outras informações a respeito de um determinado assunto. Eu lei os manuais, recorro aos velhos livros do Ramalho e Vidal, procuro no google e também pesquiso aqui no fórum. Às vezes achamos vários tópicos sobre o assunto específico, mas não atinge as dúvidas e as perguntas que temos sobre aquele assunto. Por isso recorro aos tópicos. Percebi aqui no fórum que existem os mestres que tomam seus preciosos tempos para nos ajudarem. Isso é uma grandeza enorme do ser humano. No meu caso eu mais preciso de ajuda do que posso ajudar. Agradeço enormemente a sua grande ajuda, será de grande aprendizado..muito obrigado.


Josmar
Responder