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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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