Monitoramento dos processos ativos
18/08/2004
0
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
Ojschirmer
Posts
18/08/2004
Nildo
Boa sorte!
18/08/2004
Nildo
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é...
19/08/2004
Ojschirmer
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
19/08/2004
Nildo
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?
19/08/2004
Ojschirmer
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
19/08/2004
Nildo
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.
19/08/2004
Ojschirmer
Obrigadao...
vou tentar com thread para ver se melhora a perfomance e não aloca memoria desnecessariamente....
T+
Odair
Clique aqui para fazer login e interagir na Comunidade :)