jueves, 21 de enero de 2010

Process: Esperar a que un proceso termine

Pero puede que no nos baste con indicar el proceso, ya que es posible que también nos interese saber si aún sigue en funcionamiento, y en ese caso, podríamos esperar a que finalizara o bien transcurrido un tiempo finalizarlo nosotros por nuestra cuenta.
La verdad es que esto último deberíamos tomárnoslo con calma, ya que solo en casos muy extremos desearíamos finalizar un proceso que hemos lanzado, pero es posible, ahora veremos cómo lo tendríamos que hacer, además de que en una de las aplicaciones que acompañan a este artículo tendremos ocasión de ver un ejemplo práctico de terminar un proceso que está en ejecución, ¡incluso si nosotros no lo hemos iniciado!

Para saber si el proceso está en funcionamiento o ha terminado, podemos usar la propiedad HasExited, si devuelve True es que el proceso ha terminado.
Por ejemplo, si usando el código anterior queremos esperar a que se cierre el bloc de notas, lo podemos
hacer así:

Console.WriteLine("Esperando a que  termine")
Do
  Console.Write(".")
Loop
While p.HasExited =  False
Console.WriteLine()


Por otra parte si queremos detener el proceso lo podemos hacer de dos formas, llamando al método Kill o bien CloseMainWindow.
Este código hará que termine cuando pulsemos la letra x y pulsemos Intro:

Console.Write("Esperando a que termine, ")
Console.Write("pulsa 'x' para finalizar el proceso ")
Do
  Dim c As Integer = Console.Read()
  If ChrW(c) = "x"
Then
    'p.Kill()
    p.CloseMainWindow()
  End
If
Loop While p.HasExited = False
Console.ReadLine()


Obtener información de los procesos en ejecución

La clase Process no solo nos sirve para iniciar nuevos procesos, también la podemos usar para obtener información de los procesos que están en ejecución, bien de forma global, es decir, de todos los procesos en funcionamiento o para averiguar si alguno en concreto está funcionando.

Para obtener todos los procesos que se están ejecutando podemos usar el método compartido GetProcesses, el cual devuelve un array del tipo Process con cada uno de los procesos que actualmente están en ejecución.
Para mostrarlos todos, podemos usar el siguiente código:

' Lista de procesos en ejecución
Dim ps()
As Process = Process.GetProcesses()
For Each pr As Process
In
ps
Console.WriteLine(pr.ProcessName)
Next


Los procesos mostrados serán todos, incluso los de las aplicaciones que se inician ocultas, por tanto si nos
decidimos finalizar alguna aplicación de las que tenemos en el array devuelto por GetProcesses debemos tener en cuenta de que puede ser un proceso del sistema, ¡nunca está de más saberlo!.

No hay comentarios:

Publicar un comentario