Problemas com Application.OnIdle e Application.OnMessage?
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:
e no evento OncreateForm eu coloquei
e dentro do timer coloquei
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.
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
Curtidas 0
Respostas
Claudio Ferreira
26/01/2015
Como assim "processo rodando dentro do sistema (meu programa) " explique melhor
GOSTEI 0
João Pereira
26/01/2015
se por exemplo houver um
rodando, quero que ele só de a mensagem de inativo se todos os laços, condições, threads... estiverem parados.
deu para compreender ?
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
26/01/2015
talvez tenha alguma Const para adicionar no meu
assim pararia o Timer.
Case Msg.Message of
assim pararia o Timer.
GOSTEI 0
João Pereira
26/01/2015
Resolvi substituindo o Case
por
mas ainda não esta como eu queria. :/
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
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;
Faz um teste :
for i:= 0 to 100000 do
Begin
sleep(150);
Application.HandleMessage;
End;
GOSTEI 0
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