Página 1 de 1
Função FT_Ontick()
Enviado: 03 Jun 2015 09:22
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
Função FT_Ontick()
Enviado: 03 Jun 2015 10:33
por Itamar M. Lins Jr.
Já testou ai, para ver se funciona ?
Saudações,
Itamar M. Lins Jr.
Função FT_Ontick()
Enviado: 03 Jun 2015 11:02
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.
Função FT_Ontick()
Enviado: 03 Jun 2015 11:05
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.
Função FT_Ontick()
Enviado: 03 Jun 2015 11:14
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.
Função FT_Ontick()
Enviado: 03 Jun 2015 13:52
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
Função FT_Ontick()
Enviado: 03 Jun 2015 14:35
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.
Função FT_Ontick()
Enviado: 03 Jun 2015 15:49
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
Função FT_Ontick()
Enviado: 03 Jun 2015 17:31
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.
Função FT_Ontick()
Enviado: 04 Jun 2015 13:50
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