VB.NET - Usando a classe System.Diagnostic.Process
Para acompanhar este artigo você precisa saber o que é um processo. O que é um
processo ?
Indo direto ao que interessa um processo é simplesmente uma aplicação que esta rodando no seu computador.
Pois bem , agora que você já sabe o que é um processo (os puristas que me desculpem...) , voltemos ao assunto do artigo. Neste artigo eu vou falar sobre a classe Process do namespace System.Diagnostic. Ela pode ser usada para iniciar e parar processos , controlar e monitorar aplicações.
Usando a classe Process você pode obter informações sobre processos e aplicações , pode também usá-la para criar uma instância de uma aplicação ou parar um processo que esta sendo executado. A grosso modo poderíamos dizer que a classe Process é a sucessora do comando Shell do VB6 (lembra dele ?)
Nota: Uma thread (linha de execução) é a unidade básica com a qual o sistema operacional aloca o tempo de processos. Uma thread pode executar qualquer parte do código do processo , incluindo partes que estão sendo atualmente executadas por outra thread.
Obtendo informação do processo atual
Quais informações podemos obter através da classe Process ? A seguir temos uma tabela com a relação dos principais membros da classe Process: (para uma relação completa das propriedades e métodos consulte a documentação)
BasePriority |
Obtêm a base prioritária do processo associado. |
Container |
Obtêm a IContainer que contém o componente |
EnableRaisingEvents |
Obtêm ou define se o evento Exited será disparado quando o processo terminar. |
ExitCode |
Obtêm um valor para o processo associado quando o mesmo é encerrado. |
ExitTime |
Obtêm a hora que o processo associado encerrou. |
Handle |
Retorna o handle do processo associado nativo. |
HandleCount |
Obtêm o número de handles abertos pelo processo. |
HasExited |
Obtêm um valor indicando se o processo associado terminou. |
Id |
Obtêm o identificador único para o processo associado. |
MachineName |
Obtêm o nome do computador no qual o processo associado esta rodando. |
MainModule |
Obtêm o módulo principal do processo associado. |
MainWindowHandle |
Obtêm o handle da janela para a janela principal do processo associado. |
MainWindowTitle |
Obtêm o titulo da janela principal do processo. |
ProcessName |
Obtêm o nome do processo. |
Responding |
Obtêm um valor indicando se a interface do usuário do processo esta respondendo |
Site |
Obtêm ou define o ISite do componente. |
StartTime |
Obtêm a hora que o processo associado foi iniciado. |
Threads |
Obtêm o conjunto de threads que estão rodando no processo associado. |
TotalProcessorTime |
Obtêm a tempo total de processamento para este processo. |
UserProcessorTime |
Obtêm o tempo de processamento este processo. |
VirtualMemrySize |
Obtêm o tamanho da memória virtual do processo. |
WorkingSet |
Obtêm a memória física associada ao processo atual. |
Agora vamos ver um exemplo prático onde iremos obter algumas informações do processo na máquina local.
Crie um novo projeto do tipo
Console Application e insira o código conforme abaixo:
Imports System.Diagnostics Module Module1 Sub Main() Dim proc As Process = Process.GetCurrentProcess Console.WriteLine("Identificador do processo : " & proc.Id.ToString) Console.WriteLine("Nome do Processo: " & proc.ProcessName) Console.WriteLine("Handle do processo: " & proc.Handle.ToString) Console.WriteLine("Titulo da janela principal do processo : " & proc.MainWindowTitle) Console.WriteLine("Informação da base prioritária : " & proc.BasePriority) Console.WriteLine("Número de handles abertos pelo processo : " & proc.HandleCount.ToString) Console.WriteLine("A interface do usuário esta respondendo ? " & proc.Responding.ToString) Console.ReadLine() End Sub End Module
|
No código acima estou usando o processo atual - GetCurrentProcess - para retornar uma referência para o componente processo das aplicações. O Método GetCurrentProcess é shared (estático) por isto não foi preciso criar uma instância da classe Process. Após obter uma referência para o processo atual estou usando algumas das propriedades da classe para obter informações. O resultado obtido é o seguinte :
Obtendo uma lista dos processos atuais
É uma tarefa simples obter uma relação dos processos rodando no seu sistema. Para isto vamos usar o método estático (shared) GetProcess() ; ele retorna uma Array dos componentes do processo. O código abaixo mostra como fazer isto:
Imports System.Diagnostics Module Module1 Sub Main() Dim proc As Process For Each proc In Process.GetProcesses Console.WriteLine("Processo # " & proc.ProcessName) Next Console.ReadLine() End Sub End Module
|
O resultado obtido na minha máquina local é :
Iniciando um processo
Vou mostrar agora como iniciar um processo. Para fazer isto vou usar o método estático Start da classe Process. No código abaixo vou iniciar o programa NotePad.exe de três formas diferentes:
Imports System.Diagnostics Module Module1 Sub Main() Process.Start("notepad.exe") Process.Start("notepad.exe", "c:\teste\clientes.txt") Process.Start("c:\teste\clientes.txt") End Sub End Module |
No código temos :
1- Process.Start("notepad.exe") - inicia uma instância do programa Notepad.exe
2- Process.Start("notepad.exe", "c:\teste\clientes.txt") - inicia uma instância do programa Notepad.exe e abre o arquivo clientes.txt
3- Process.Start("c:\teste\clientes.txt") - inicia uma instância do programa que estiver registrado para abrir arquivos com a extensão txt.
Embora o esquema acima funcione você não tem muito controle sobre os processos. Para isto devemos criar uma instância da classe Process e usar o objeto StartInfo. Ele representa um conjunto de parâmetros usados para iniciar um processo. A única propriedade obrigatória que devemos informar é a propriedade FileName ela indica o nome do processo que queremos iniciar.
A vantagem em usar este objeto é que podemos realizar o tratamento de erros se o arquivo não estiver registrado e podemos saber quando o processo foi encerrado Vejamos como fica o código para iniciar o NotePad.exe :
Imports System.Diagnostics Module Module1 Sub Main() Dim proc As New Process() proc.StartInfo.FileName = "Notepad.exe" proc.StartInfo.Arguments = "c:\teste.clientes.txt" proc.Start() End Sub End Module |
Perceba que primeiro criamos uma instância da classe Process e a seguir definimos o nome do processo que vamos iniciar indicando um argumento pertinente e finalmente iniciamos o processo.
Usando eventos para descobrir quando um processo terminou
A classe Process expõe dois eventos : Disposed : é herdado de Component e Exited : que ocorre quando o processo termina.
Para tratar os eventos primeiro temos que criar um manipulador de eventos que irá ser executado quando o processo terminar. No nosso manipulador vamos escrever as propriedades ExitCode e ExitTime na janela de saída indicando que o processo terminou. O código é o seguinte:
Imports System.Diagnostics Module Module1 Sub Main() Dim proc As New Process() proc.StartInfo.FileName = "Notepad.exe" proc.StartInfo.Arguments = "c:\teste\clientes.txt" proc.EnableRaisingEvents = True AddHandler proc.Exited, AddressOf processoTerminou proc.Start() Console.ReadLine() End Sub Private Sub processoTerminou(ByVal sender As Object, ByVal e As EventArgs) Dim proc As Process = CType(sender, Process) Console.WriteLine("Saiu " & proc.ExitCode) Console.WriteLine("Terminou as : " & proc.ExitTime.ToString) Console.ReadLine() End Sub End Module
|
Após criar o manipulador de eventos - processoTerminou() - para sabermos quando o evento foi disparado temos que incluir duas linhas de código antes de iniciar o processo. Devemos definir EnableRaisingEvents como True afim de permitir que evento dispare e precisamos incluir também o tratamento do evento Exited relacionando-o com a rotina - processoTerminou() - que criamos.
O resultado após encerrar o aplicativo será:
Se porventura ocorrer um erro devido ao aplicativo indicado não estar registrado no sistema , a classe Process fornece a janela padrão de erro. Para permitir esta funcionalidade você deve definir a propriedade ErrorDialog como True :
proc.StartInfo.ErrorDialog = True
Por hoje é só. Até o próximo artigo VB.NET
Veja os
Destaques e novidades do SUPER DVD Visual Basic
(sempre atualizado) : clique e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
|
Gostou ?
Compartilhe no Facebook
Compartilhe no Twitter
Referências: