Problemas com Application.OnIdle e Application.OnMessage?

Delphi

26/01/2015

Estou com problemas para detectar o tempo de ociosidade do meu sistema, eu quero que ele exiba uma menssagem caso o mesmo esteja ocioso a dez segundos, eu coloquei um Timer com interval de 10000 e duas procedures

LigaTimer e DesligaTimer:
procedure TFrmSps.LigaTimer(Sender: TObject; var Done: Boolean);
begin
  Timer1.Enabled := true;
end;


procedure TFrmSps.DesligaTimer(var Msg: tagMSG; var Handled: Boolean);
begin
  Case Msg.Message of
    WM_LBUTTONDBLCLK, WM_MBUTTONDBLCLK, WM_RBUTTONDBLCLK,
      WM_LBUTTONDOWN, WM_MBUTTONDOWN, WM_RBUTTONDOWN,
      WM_NCLBUTTONDOWN, WM_NCMBUTTONDOWN, WM_NCRBUTTONDOWN,
      WM_DEADCHAR, WM_KEYDOWN, WM_SYSCHAR, WM_SYSKEYDOWN,
      WM_SYSDEADCHAR:
      Timer1.Enabled := False;
  end;
end;


e no evento OncreateForm eu coloquei


  Application.OnIdle    := LigaTimer;
  Application.OnMessage := DesligaTimer;



e dentro do timer coloquei
  Timer1.Enabled := False;
  ShowMessage('Alerta! O Sistema está ocioso!');


Funciona bem, porém eu quero que ele não detecte só os movimentos do mouse e teclado para verificar se esta ocioso, eu quero que ele detecte se há algum processo rodando dentro do sistema (meu programa) e sete False para o timer se tiver.

Se alguém puder ajudar ficaria grato.
João Pereira

João Pereira

Curtidas 0

Respostas

Claudio Ferreira

Claudio Ferreira

26/01/2015

Como assim "processo rodando dentro do sistema (meu programa) " explique melhor
GOSTEI 0
João Pereira

João Pereira

26/01/2015

se por exemplo houver um

for i:= 0 to 100000 do
sleep(150);



rodando, quero que ele só de a mensagem de inativo se todos os laços, condições, threads... estiverem parados.
deu para compreender ?
GOSTEI 0
João Pereira

João Pereira

26/01/2015

talvez tenha alguma Const para adicionar no meu

Case Msg.Message of


assim pararia o Timer.
GOSTEI 0
João Pereira

João Pereira

26/01/2015

Resolvi substituindo o Case
por
 
 if (Msg.Message = WM_TIMER) or (Msg.Message = WM_MENUSELECT) then
    exit;

  Timer1.Enabled := False;


mas ainda não esta como eu queria. :/
GOSTEI 0
Claudio Ferreira

Claudio Ferreira

26/01/2015

Não sei se vai funcionar mas experimenta colocar onde tiver qualquer loop ou thread rodando o comando Application.HandleMessage.

Faz um teste :

for i:= 0 to 100000 do
Begin
sleep(150);
Application.HandleMessage;
End;
GOSTEI 0
Claudio Ferreira

Claudio Ferreira

26/01/2015

Acho que o evento OnIdle só é acionado quando não há mensagens do windows para processar, por esse motivo a execução de threads paralelos não é considerada como algo rodando ou em execução, e sua rotina não funciona da maneira esperada.
GOSTEI 0
POSTAR