Página 1 de 1
InkeyGui, inkey alternativo com 0% uso processador
Enviado: 10 Jul 2014 08:54
por asimoes
Uma alternativa para o inkey() para verificar interrupções do teclado utilizando 0% do processador.
InkeyGUI([<nMilliSec>])
Código: Selecionar todos
#pragma BEGINDUMP
#include <windows.h>
#include "hbapi.h"
HB_FUNC( INKEYGUI )
{
MSG Msg;
BOOL lNoLoop=FALSE;
UINT dwTimer, nRet=0, uTimeout=10;
if( HB_ISNUM(1) ) uTimeout = hb_parni(1);
if( uTimeout==0 ) uTimeout = 0x0FFFFFFF;
dwTimer = SetTimer( NULL, 0, uTimeout, NULL);
while( GetMessage(&Msg, NULL, 0, 0) )
{
switch( Msg.message )
{
case WM_KEYDOWN :
case WM_SYSKEYDOWN : { nRet = Msg.wParam; lNoLoop = TRUE; break; }
case WM_TIMER : { lNoLoop = Msg.wParam == dwTimer; break; }
}
if( lNoLoop )
{
KillTimer( NULL, dwTimer );
hb_retni( nRet );
return ;
}
else
{
TranslateMessage( &Msg ); // Translates virtual key codes
DispatchMessage( &Msg ); // Dispatches message to window
}
}
}
#pragma ENDDUMP
InkeyGui, inkey alternativo com 0% uso processador
Enviado: 11 Jul 2014 13:44
por janio
De repente mim deu aqui um apagao de memoria...
Em que situação eh preciso usar esse recurso?
Janio
InkeyGui, inkey alternativo com 0% uso processador
Enviado: 11 Jul 2014 14:47
por asimoes
Você pode utilizar este recurso com MiniGui e HwGui on a função inkey não funciona.
InkeyGui, inkey alternativo com 0% uso processador
Enviado: 12 Jul 2014 11:03
por fladimir
aSimoes, vc testou se dá pra fazer um Translate, tipo se alguém estiver migrando de Console pra GUI e tem várias chamadas Inkey no sistema fazer um Translate ou algo do tipo para não precisar ficar trocando no código, ai tipo
Será q funcionaria?
InkeyGui, inkey alternativo com 0% uso processador
Enviado: 12 Jul 2014 11:29
por asimoes
Acho que funciona sim Fladimir.
vou testar e informo o resultado.
InkeyGui, inkey alternativo com 0% uso processador
Enviado: 12 Jul 2014 11:48
por asimoes
Fladimir,
o translate funciona só tem que ver a questão do tempo que é em milisegundos ou seja para 1 segundo = 1000, então o inkey teria que ser inkey(1000)
Tem que analisar isso e usar onde for realmente necessário.
#xtranslate inkey(<n>) => inkeygui(<n>)
InkeyGui, inkey alternativo com 0% uso processador
Enviado: 12 Jul 2014 12:00
por asimoes
Pronto, resolvido a questão do milisec.
Linha 12
if( uTimeout>0 ) uTimeout = uTimeout * 1000;
É só substituir a função INKEYGUI
Então o inkey(1) = 1 segundo...
Código: Selecionar todos
HB_FUNC( INKEYGUI )
{
MSG Msg;
BOOL lNoLoop=FALSE;
UINT dwTimer, nRet=0, uTimeout=10;
if( HB_ISNUM(1) ) uTimeout = hb_parni(1);
if( uTimeout==0 ) uTimeout = 0x0FFFFFFF;
if( uTimeout>0 ) uTimeout = uTimeout * 1000;
dwTimer = SetTimer( NULL, 0, uTimeout, NULL);
while( GetMessage(&Msg, NULL, 0, 0) )
{
switch( Msg.message )
{
case WM_KEYDOWN :
case WM_SYSKEYDOWN : { nRet = Msg.wParam; lNoLoop = TRUE; break; }
case WM_TIMER : { lNoLoop = Msg.wParam == dwTimer; break; }
}
if( lNoLoop )
{
KillTimer( NULL, dwTimer );
hb_retni( nRet );
return ;
}
else
{
TranslateMessage( &Msg ); // Translates virtual key codes
DispatchMessage( &Msg ); // Dispatches message to window
}
}
}
InkeyGui, inkey alternativo com 0% uso processador
Enviado: 12 Jul 2014 16:02
por janio
Essa função seria identica a Millisec() ??
InkeyGui, inkey alternativo com 0% uso processador
Enviado: 12 Jul 2014 16:14
por asimoes
Janio,
Não, porque ela retorna o valor da tecla digitada e a função millisec até onde eu sei não faz isso.
InkeyGui, inkey alternativo com 0% uso processador
Enviado: 12 Jul 2014 16:16
por asimoes
Uma observação a todos a função só trabalha com inteiros ou seja se passar valores tipo .5 ou 1.5 não vai funcionar, a não ser que alguém altere o código da função.
InkeyGui, inkey alternativo com 0% uso processador
Enviado: 12 Jul 2014 18:01
por fladimir
Legal, parabéns...
InkeyGui, inkey alternativo com 0% uso processador
Enviado: 12 Jul 2014 21:43
por JoséQuintas
No Clipper eu fazia isso, mas usando fonte Clipper e OSLIB.
Mas em GUI nem sempre dá pra usar o Inkey.
InkeyGui, inkey alternativo com 0% uso processador
Enviado: 13 Jul 2014 12:05
por asimoes
Outra função que pode ser usada:
Não sobrecarrega o processador e poder ser usada tando em console/gui
Ex. SysWait(.5) ou SysWait(1)
Código: Selecionar todos
FUNCTION SysWait(nWait)
LOCAL iTime:=Seconds()
HB_Default(@nWait,5)
DO WHILE Seconds() - iTime < nWait
hb_idlesleep() //necessário para não sobrecarregar o processador
hwg_doevents() //ou do events (minigui) ou nenhuma das duas se usado somente em modo console.
ENDDO
RETURN Nil
InkeyGui, inkey alternativo com 0% uso processador
Enviado: 04 Ago 2014 22:54
por janio
Alem de capturar a tecla pressionada, eu uso o inkey para, por exemplo, exibir uma mensagem por nSegundos na tela antes de sumir.
No meu sistema feito com hwgui, substitui os inkey's por millisec. Ocorre que sempre q chamo essa função o dialog trava (aparece na barra de titulo "não está respondendo").
Mas com essa sua função (INKEYGUI()) nao trava de jeito nenhum! Gostei!!!