control de Procesos

13/02/2004 - 17:00 por Carlos Pérez Sáez | Informe spam
Buenas, necesito realizar una aplicacion que lanze un
proceso (un ejecutable .exe), y CUANDO TERMINE, lea el
tiempo de cpu y memoria consumidos por el proceso.

Esto lo hago con la clase Process, lanzo el proceso y me
preparo el evento para que cuando termine, active el evento
y pueda interrogar al proceso.

El problema esta en que cuando se activa el evento ( evento
Exited) el proceso ya ha terminado y los datos que quiero
consultar ya no estan disponibles (eso dice el error que
genera).

He intentado hacerlo como viene en el ejemplo de Process,
que es estar preguntando todo el rato hasta que termina,
lo que pasa que de ese modo no me da exacto el resultado,
ya que pregunta y despues acaba, y yo necesito el dato exacto.

Yo creo que el camino estaria en hacer de alguna forma que
el proceso antes de acabar se suspenda o algo asi.

La pregunta entonces es si alguien sabe como calcular el
tiempo de cpu que un proceso lanzado por mi gasta EXACTAMENTE.

Un saludo y gracias, pego el codigo para que os pongais en
contexto:

using System;
using System.Diagnostics;
using System.Threading;

namespace lanzadorProcesos
{
/// <summary>
/// Descripción breve de Class1.
/// </summary>
class Class1
{
/// <summary>
/// Punto de entrada principal de la aplicación.
/// </summary>
[STAThread]

static void Main(string[] args)
{
claseLanzadora miclase=new claseLanzadora();
miclase.lanzaproceso();
Console.Write("Fin");


}

}
class claseLanzadora
{
Process x;
public void lanzaproceso()
{
//lanzamos el proceso aqui
x=Process.Start(@"c:\windows\system32\cmd.exe");
x.EnableRaisingEvents=true; //aqui le digo que me active
los eventos
x.Exited += new
System.EventHandler(this.Exited_proceso); //linko el evento
a mi funcion
x.WaitForExit(); //espero a que termine el proceso
Console.WriteLine("Pulse una tecla para continuar");
Console.ReadLine();

}


//funcion para manejar el evento de acabado el proceso.
private void Exited_proceso (object sender, EventArgs e)
{

Console.Write(x.TotalProcessorTime.Milliseconds.ToString());
//No funciona porque ya ha acabado
//¿que hacer aqui??

Console.WriteLine("Fin exited proceso");
}

}
}

Preguntas similare

Leer las respuestas

#1 Renato Amaya
15/02/2004 - 13:03 | Informe spam
BUeno pues podrias tratar en la funcion destructora de la clase. O si
estas trabajando con ventanas podias hacer el calculo justo cuando
QueryUnload la ultima ventana.

... Espero q te sirva,
Respuesta Responder a este mensaje
#2 Anonimo
15/02/2004 - 23:02 | Informe spam
Cuando se destruye la clase no funciona, porque en el
ejemplo, la clase Process x, cuando levanta el evento,
realmente no se esta destruyendo, ya que se pueden
consultar "algunos" datos sobre ella, (time finish por
ejemplo), asi que descartada.

La segunda opcion tampoco sirve porque
a) Yo no dispongo del codigo fuente de la aplicacion que
estoy evaluando
b) Mis aplicaciones no son ventanas, son procesos puros y
duros de consola, de calculo masivo.

Lo que habia pensado es que como todos mis procesos son
aplicaciones de .net es meterle al final del codigo de
ejecucion un Console.Read, pero en byte code, de esta forma
se bloquea el proceso, el tiempo de cpu no avanza y es
entonces cuando se puede interrogar los datos del proceso,
el problema esta en que no tengo n.p.i de como meter una
instruccion en byte code al final de un ensamblado antes de
ejecutarlo. ¿Alguien sabe por donde debeira buscar esa
solucion?

Un saludo y gracias por vuestro tiempo.




BUeno pues podrias tratar en la funcion destructora de la


clase. O si
estas trabajando con ventanas podias hacer el calculo


justo cuando
QueryUnload la ultima ventana.

Espero q te sirva,

.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida