Clipper On Line • Ver Tópico - verificar ociosidade de sistema

verificar ociosidade de sistema

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

verificar ociosidade de sistema

Mensagempor rossine » 29 Abr 2014 20:17

Olá pessoal,

Eu tinha um código feito em minigui aqui que detecta a inatividade do teclado e mouse e também ao termino de um determinado tempo ele executa uma função simulando uma proteção de tela.

Veja se ele server pra vocês:

#include "minigui.ch"

static oWnd, oTimerTime, oLabel, oLabel2

*************
function main
*************

define window oWnd title "Teste de teclado e mouse" MAIN

   @50, 20 Label oLabel Value "" AUTOSIZE TRANSPARENT

   @90, 20 Label oLabel2 Value "Se o teclado ou mouse for usado o contador será reiniciado..." AUTOSIZE TRANSPARENT

   DEFINE TIMER Timer1 INTERVAL 1000 ACTION{ || VER_TEMPO() }

end window

activate window oWnd

return NIL

*************************
static function VER_TEMPO
*************************

oWnd.oLabel.value := "Vou executar a proteção de tela em " + hb_ntos(int(11 - sysidlesecs())) + " segundos"

if sysidlesecs() > 10
   oWnd.Timer1.enabled := .F.
   msgstop( "executando a proteção de tela" )
   oWnd.Timer1.enabled := .t.
endif

return NIL

**----------------------------------------------------------------------

#pragma BEGINDUMP

#include "windows.h"
#include "hbapi.h"
/*
typedef struct tagLASTINPUTINFO {
    UINT cbSize;
    DWORD dwTime;
} LASTINPUTINFO, *PLASTINPUTINFO;
*/
WINUSERAPI BOOL WINAPI GetLastInputInfo(PLASTINPUTINFO);
typedef  BOOL (WINAPI *GETLASTINPUTINFO_)(PLASTINPUTINFO);

HB_FUNC( SYSIDLESECS )
{
   HINSTANCE handle= LoadLibrary("user32.dll");
   if ( handle)
   {
      GETLASTINPUTINFO_ pFunc;
      pFunc = GetProcAddress( handle,"GetLastInputInfo" );
      if (pFunc)
      {
         LASTINPUTINFO lpi;
   
         lpi.cbSize = sizeof(LASTINPUTINFO);

         if (!pFunc(&lpi))
         {
            hb_retni(0);
         }
         else
         {
            hb_retnd( ( DOUBLE ) ( GetTickCount() - lpi.dwTime ) * 0.001 );
         }
      }
   else
      {
         hb_retni(0);
      }
   }

   if (handle)
      {
         FreeLibrary( handle);
      }
}
#pragma ENDDUMP
**----------------------------------------------------------------------



Vejam que na rotina em C++ tem um código comentado. Se precisarem tirem este comentário.

Bom, espero ter ajudado.

Abraços,

Rossine.
Rossine.

Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
rossine
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 313
Data de registro: 06 Ago 2007 09:57
Cidade/Estado: Divinópolis-MG
Curtiu: 1 vez
Mens.Curtidas: 21 vezes

verificar ociosidade de sistema

Mensagempor Toledo » 29 Abr 2014 21:12

Rossine, seu código está bem mais completo.

Abraços,
Anexos
idlesystem2.zip
(650.84 KiB) Baixado 138 vezes
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

verificar ociosidade de sistema

Mensagempor asimoes » 29 Abr 2014 22:03

Rossine,

Obrigado por compartilhar.

Fiz uma correção na função e agora está funcionando.

Testei assim:
DEFINE TIMER Timer_1 OF Form_Main INTERVAL 1000 ACTION Aviso()

FUNCTION Aviso
   Form_Main.StatusBar.Item(1) := SecToTime(PegaInatividade()) //só para saber se está ok.
   IF PegaInatividade() > 60
      MsgInfo("Parei")
   ENDIF
RETURN Nil

#pragma BEGINDUMP
#include "windows.h"
#include "hbapi.h"

HB_FUNC( PEGAINATIVIDADE )
{
   typedef struct tagLASTINPUTINFO
   {
       UINT cbSize;
       DWORD dwTime;
   } LASTINPUTINFO, *PLASTINPUTINFO;

   WINUSERAPI BOOL WINAPI GetLastInputInfo(PLASTINPUTINFO);
   typedef  BOOL (WINAPI *GETLASTINPUTINFO_)(PLASTINPUTINFO);

   HINSTANCE handle= LoadLibrary("user32.dll");
   if ( handle)
   {
      GETLASTINPUTINFO_ pFunc;
      pFunc = GetProcAddress( handle,"GetLastInputInfo" );
      if (pFunc)
      {
         LASTINPUTINFO lpi;
   
         lpi.cbSize = sizeof(LASTINPUTINFO);

         if (!pFunc(&lpi))
         {
            hb_retni(0);
         }
         else
         {
            hb_retnd( ( DOUBLE ) ( GetTickCount() - lpi.dwTime ) * 0.001 );
         }
      }
   else
      {
         hb_retni(0);
      }
   }

   if (handle)
      {
         FreeLibrary( handle);
      }
}

#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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

verificar ociosidade de sistema

Mensagempor asimoes » 29 Abr 2014 22:18

Uma pequena correção:

FUNCTION AVISO
   Form_Main.StatusBar.Item(1) := SecToTime(PegaInatividade())
   IF PegaInatividade() > 60
      Form_Main.Timer_1.Enabled:=.F.
      MsgInfo("Parei")
      Form_Main.Timer_1.Enabled:=.T.
   ENDIF
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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

verificar ociosidade de sistema

Mensagempor rossine » 29 Abr 2014 22:24

Rossine, seu código está bem mais completo.


OK Toledo :D

Asimões,

Obrigado pela correção principalmente no código C++ que não entendo nada. Só uma pequena correção em teu código para ele ficar 100% na minha opnião:
Criei a variável nInat para armazenar o retorno da função PegaInatividade(), para evitar a execução da mesma duas vezes, ok ?

DEFINE TIMER Timer_1 OF Form_Main INTERVAL 1000 ACTION Aviso()

FUNCTION Aviso
   local nInat := SecToTime(PegaInatividade()) //só para saber se está ok.
   Form_Main.StatusBar.Item(1) := nInat
   IF nInat > 60
      Form_Main.Timer_1.Enabled:=.F.
      MsgInfo("Parei")
      Form_Main.Timer_1.Enabled:=.T.
   ENDIF
RETURN Nil


Corrija-me se eu estiver errado ou como melhorar o código ok ?

Obrigado,

Rossine.
Rossine.

Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
rossine
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 313
Data de registro: 06 Ago 2007 09:57
Cidade/Estado: Divinópolis-MG
Curtiu: 1 vez
Mens.Curtidas: 21 vezes

verificar ociosidade de sistema

Mensagempor asimoes » 29 Abr 2014 22:34

Rossine,

Com o timer a cada 1 seg. o valor de nInat sempre vai estar atualizado. sempre há uma chamada a função PegaInatividade()

Eu acho que o código atende o que o Hasa quer.
â–º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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

verificar ociosidade de sistema

Mensagempor Claudio Soto » 30 Abr 2014 00:19

Un pequeño aporte,
no es necesario llamar en forma indirecta la función GetLastInputInfo:
#pragma BEGINDUMP

#include "windows.h"
#include "time.h"
#include "hbapi.h"

HB_FUNC( PEGAINATIVIDADE )
{
   LASTINPUTINFO lpi;
   lpi.cbSize = sizeof (LASTINPUTINFO);
   GetLastInputInfo (&lpi);
   hb_retnd( ( DOUBLE ) ( GetTickCount() - lpi.dwTime ) / CLOCKS_PER_SEC );
}

#pragma ENDDUMP
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Avatar de usuário

Claudio Soto
Colaborador

Colaborador
 
Mensagens: 555
Data de registro: 27 Ago 2012 12:31
Cidade/Estado: Uruguay
Curtiu: 35 vezes
Mens.Curtidas: 166 vezes

verificar ociosidade de sistema

Mensagempor HASA » 30 Abr 2014 09:52

:)) :* :{
Muito Bom dia, gostaria de agradecer a todos que prestaram sua colaboração nesse pequeno projeto que de forma simples podera abrir portas nas mentes brilhantes dos colegas.
Valeu Toledo por ter plantado a primeira semente, e aos demais que a adubaram. ( Nossa nem sou do campo e estou quase criando uma horta aqui :)) ) mas... a verdade é que fiquei muito Feliz com o resultado.
X:)
HASA
Avatar de usuário

HASA
Colaborador

Colaborador
 
Mensagens: 1082
Data de registro: 01 Set 2003 19:50
Cidade/Estado: São Paulo
Curtiu: 1 vez
Mens.Curtidas: 51 vezes

Anterior



Retornar para MiniGui

Quem está online

Usuários vendo este fórum: HASA e 4 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro