Array
(
)

Monitoramento dos processos ativos

Ojschirmer
   - 18 ago 2004

Pessoal,
Tenho um sistema que monitora, atraves de timer, se algumas aplicacoes estao rodando e caso uma delas pare de executar esta coloque força a execucao do mesmo.
A aplicacao rodava em winNT perfeitamente usando as funcoes
EnumProcesses e EnumProcessModules da unit psApi ...
porem na winXP, na durante a execucao do sistema, o mesmo fica acrescentado 5kb a cada leitura das rotinas acima citadas...
Eu nao sei o que pode ser... estou usando Delphi 5...
Apenas sei que a versao do psApi.dll são diferentes devido a versao do winxx.

Agradeco desde ja alguma ajuda...

Odairjose


Nildo
   - 18 ago 2004

Porque não simplesmente ´evitar´ que a aplicação seja finalizada? Se essa idéia lhe interessar, baixe o MadCollection em http://www.madshi.net/ (free para uso não comercial). Feito isso você vai ter que utilizar a biblioteca MadCodeHook, que vem com esse pacote. Vem um Demo em uma pasta desse MadCodeHook que faz justamente isso, não permite que aplicações sejam fechadas.

Boa sorte!


Nildo
   - 18 ago 2004

Ou então, baixe esta unit:
http://www.madshi.net/enumStuff.zip

Com ela você pode enumerar todos os processos ativos, com uma diferença, as funções dessa unit funcionam em todos as versões do Windows, elas fazem as checagens automáticas de qual DLL é melhor para ela utilizar. Enfim, não custa tentar né...


Ojschirmer
   - 19 ago 2004

nildo,

obrigado pelas dicas... o meu sistema ele devera supervisionar se as aplicacoes estao rodando e se uma delas parar (por diversos motivos) o mesmo devera parar outras aplicacoes que dependem desta... e em
seguida colocar no ar todas as aplicacoes...

eu testei a rotina enumstuff, porem as vezes qdo voce derruba a aplicacao o sistema aloca mais espaco na memoria (isto apenas em XP)..

segue as rotinas que fiz para teste.. e se for possivel gostaria que voce verificasse se esqueci de alguma coisa... ou testasse para mim...

Basta criar um form e adicionar um ttimer e um tlabel ....

function TForm1.ProcessIsRun(pProcesso:string):boolean;
var
plProcess : TProcessList;
iconta : integer;
vAux:string;
begin
plProcess := GetProcessList;
result:=false;
iConta:=-1;
repeat
inc(iConta);
vAux:= plProcess[iconta].name;
if ansiuppercase(vAux) = ansiuppercase(pProcesso) then
result:=True;
until iConta = high(plProcess);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if ProcessIsRun(´calc.exe´) then
label1.Caption := ´Calc.exe esta rodando´
else
label1.Caption := ´Calc.exe nao esta rodando´;
end;

agradece desde ja...

Odair


Nildo
   - 19 ago 2004

Olá!
Você não precisa colocar um Timer para isso. Você poderia criar uma thread para cada processo, e no Execute de cada Thread você coloca um

WaitForSingleObject( Handle_Do_Processo )

Quando passar para próxima linha quer dizer que o processo foi finalizado.

Não seria mais facil assim do que utilizar um Timer que fica eternamente comendo recurusos?


Ojschirmer
   - 19 ago 2004

nildo,

obrigado pela sugestao...

porem eu nunca trabalhei com threads...
entao gostaria de umas dicas ou material sobre o mesmo...

por exemplo, como eu vou vincular uma thread com um processo?
quando eu reinicio uma aplicacao o ID do processo muda.. isso quer
dizer que eu teria que criar uma nova thread?

agradeco desde ja sua atencao

Odair


Nildo
   - 19 ago 2004

Voce deve criar as threads dinamicamente, com uma variavel cada uma contendo o Handle to processo respectivo a essa thread. No Execute dessa thread você coloca aquele comando do

WaitForSingleObject( Handle, Infinite );

Agora, sobre como criar threads, esse tipo de coisa, você pode obter pesquisando no Google ou até mesmo aqui no fórum.


Ojschirmer
   - 19 ago 2004

Nildo,

Obrigadao...

vou tentar com thread para ver se melhora a perfomance e não aloca memoria desnecessariamente....


T+

Odair