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

Código: Selecionar todos

#IFDEF GUI
   #translate inkey..... inkeygui....
#ENDIF
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!!!