Fórum Problemas com Application.OnIdle e Application.OnMessage? #508510

26/01/2015

0

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

Responder

Posts

26/01/2015

Claudio Ferreira

Como assim "processo rodando dentro do sistema (meu programa) " explique melhor
Responder

Gostei + 0

26/01/2015

João Pereira

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 ?
Responder

Gostei + 0

26/01/2015

João Pereira

talvez tenha alguma Const para adicionar no meu

Case Msg.Message of


assim pararia o Timer.
Responder

Gostei + 0

27/01/2015

João Pereira

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. :/
Responder

Gostei + 0

29/01/2015

Claudio Ferreira

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;
Responder

Gostei + 0

29/01/2015

Claudio Ferreira

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.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar