InkeyGui, inkey alternativo com 0% uso processador

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

InkeyGui, inkey alternativo com 0% uso processador

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

InkeyGui, inkey alternativo com 0% uso processador

Mensagem por janio »

De repente mim deu aqui um apagao de memoria...

Em que situação eh preciso usar esse recurso?

Janio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

InkeyGui, inkey alternativo com 0% uso processador

Mensagem por asimoes »

Você pode utilizar este recurso com MiniGui e HwGui on a função inkey não funciona.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

InkeyGui, inkey alternativo com 0% uso processador

Mensagem 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?
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

InkeyGui, inkey alternativo com 0% uso processador

Mensagem por asimoes »

Acho que funciona sim Fladimir.
vou testar e informo o resultado.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

InkeyGui, inkey alternativo com 0% uso processador

Mensagem 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>)
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

InkeyGui, inkey alternativo com 0% uso processador

Mensagem 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 
       }  
    } 
} 
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

InkeyGui, inkey alternativo com 0% uso processador

Mensagem por janio »

Essa função seria identica a Millisec() ??
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

InkeyGui, inkey alternativo com 0% uso processador

Mensagem 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.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

InkeyGui, inkey alternativo com 0% uso processador

Mensagem 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.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

InkeyGui, inkey alternativo com 0% uso processador

Mensagem por fladimir »

Legal, parabéns...
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20416
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

InkeyGui, inkey alternativo com 0% uso processador

Mensagem por JoséQuintas »

No Clipper eu fazia isso, mas usando fonte Clipper e OSLIB.
Mas em GUI nem sempre dá pra usar o Inkey.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

InkeyGui, inkey alternativo com 0% uso processador

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

InkeyGui, inkey alternativo com 0% uso processador

Mensagem 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!!!
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Responder