2012-01-15 6 views
6

Estoy escribiendo un programa que debe registrar la hora de inicio de un proceso como bloc de notas. Pensé que es bueno crear un temporizador que verifique todos los procesos por segundo. Pero creo que ralentizará la computadora del usuario. ¿Hay una mejor manera de hacer esto?¿La mejor manera de registrar la hora de inicio del proceso?

+1

Sí, el sondeo constante es la solución incorrecta por muchas razones, una de las cuales es la degradación del rendimiento. Estás buscando un gancho. Pero no puedes escribir la DLL del gancho en C#; necesitarás usar C o C++ para eso. –

+0

¿Cuál es su objetivo real? Es difícil darle una respuesta que resuelva su problema. ¿Desea controlar el inicio de cualquier proceso o solo el inicio de un proceso específico? ¿Necesita obtener el tiempo de ejecución de los procesos supervisados ​​exactamente o solo le interesan los procesos que se ejecutan más tiempo, p. ¿10 minutos? Dependiendo de su respuesta, puede resultar que la votación sea una solución "lo suficientemente buena". Hay formas exactas de hacerlo, pero estas son significativamente más complejas. –

+0

Lo siento, ** Inglés es difícil para mí **. Quiero medir el tiempo de ejecución de un proceso y registrarlo en un archivo txt. Pero no quiero verificarlo cada segundo. –

Respuesta

3

Determina inicialmente para todos los procesos en ejecución el tiempo de creación. Luego, usa WMI para registrarse para eventos de creación de procesos.

Ver el código de abajo para un pequeño ejemplo de cómo usar WMI para eventos de la creación proceso:

static void Main(string[] args) 
{ 
    using (ManagementEventWatcher eventWatcher = 
      new ManagementEventWatcher(@"SELECT * FROM 
    __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'")) 
    { 
    // Subscribe for process creation notification. 
    eventWatcher.EventArrived += ProcessStarted_EventArrived; 
    eventWatcher.Start(); 
    Console.In.ReadLine(); 
    eventWatcher.EventArrived -= ProcessStarted_EventArrived; 
    eventWatcher.Stop(); 
    } 
} 


static void ProcessStarted_EventArrived(object sender, EventArrivedEventArgs e) 
{ 
    ManagementBaseObject obj = e.NewEvent["TargetInstance"] as ManagementBaseObject; 

    // The Win32_Process class also contains a CreationDate property. 
    Console.Out.WriteLine("ProcessName: {0} " + obj.Properties["Name"].Value); 
} 

COMENZAR EDIT: detección de la creación de procesos

He investigado aún más con WMI y hay es una solución amigable (con más recursos) (pero necesita privilegios administrativos) usando la clase Win32_ProcessStartTrace (consulte TECHNET para obtener más información):

using (ManagementEventWatcher eventWatcher = 
      new ManagementEventWatcher(@"SELECT * FROM Win32_ProcessStartTrace")) 
{ 
    // Subscribe for process creation notification. 
    eventWatcher.EventArrived += ProcessStarted_EventArrived; 
    eventWatcher.Start(); 
    Console.Out.WriteLine("started"); 
    Console.In.ReadLine(); 
    eventWatcher.EventArrived -= ProcessStarted_EventArrived; 
    eventWatcher.Stop(); 
} 

static void ProcessStarted_EventArrived(object sender, EventArrivedEventArgs e) 
{    
    Console.Out.WriteLine("ProcessName: {0} " 
      + e.NewEvent.Properties["ProcessName"].Value);  
} 

En esta solución, no es necesario establecer un intervalo de sondeo.

FIN EDITAR

COMENZAR EDIT 2:

usted podría utilizar la clase Win32_ProcessStopTrace para controlar los eventos de detención proceso. Para combinar eventos de inicio de proceso y de detención de proceso, use la clase Win32_ProcessTrace. En el controlador de eventos utilizar el proberty ClassPath de distinguir entre el inicio/parada de eventos:

using (ManagementEventWatcher eventWatcher = 
     new ManagementEventWatcher(@"SELECT * FROM Win32_ProcessTrace")) 
{   
    eventWatcher.EventArrived += Process_EventArrived; 
    eventWatcher.Start(); 
    Console.Out.WriteLine("started"); 
    Console.In.ReadLine(); 
    eventWatcher.EventArrived -= Process_EventArrived; 
    eventWatcher.Stop(); 
} 

static void Process_EventArrived(object sender, EventArrivedEventArgs e) 
{ 
    Console.Out.WriteLine(e.NewEvent.ClassPath); // Use class path to distinguish 
               // between start/stop process events. 
    Console.Out.WriteLine("ProcessName: {0} " 
     + e.NewEvent.Properties["ProcessName"].Value);  
} 

FIN EDIT 2

+0

-1 primero WMI internamente. En segundo lugar, no necesita usar WMI. El sistema operativo ya registra la hora de inicio de cada proceso. Todo lo que necesitas hacer es leerlo. Ver mi respuesta a continuación. –

+0

Gracias. ¿Hay alguna manera de verificar los procesos de cierre también? –

+1

@ MoctavaFarzán: Sí, también hay un evento __InstanceDeletionEvent. Pero si planea usar ambos __InstanceDeletionEvent y __InstanceCreationEvent, debe suscribirse para __InstanceOperationEvent y luego verificar en su devolución de llamada qué evento se produjo evaluando la propiedad e.NewEvent.ClassPath.ClassName. – Hans

2

No hay necesidad de controlar nada en absoluto. Todo lo que necesita hacer es enumerar sus procesos y obtener de las Instancias de proceso StartTime.

+0

Pero ciertamente tienes que usar un temporizador o algo así? Enumerar los procesos una vez no es suficiente. Entonces, no entiendo por qué votaste mi respuesta? – Hans

+0

Hay formas de lograrlo sin un temporizador. El principal problema con tu respuesta es que con "__InstanceCreationEvent WITHIN 1" haces una encuesta cada segundo. Si un proceso comienza y termina dentro de ese tiempo, nunca recibirá ninguna notificación. Si sabe qué proceso desea verificar, puede obtener una devolución de llamada desde el sistema operativo cuando utiliza las Opciones de ejecución del archivo de imagen. Pero primero, Farzan debe decir cómo obtiene los procesos en cuestión y cuáles son interesantes para él. Hay muchas formas de lograr esto. –

+0

Sí, estoy de acuerdo. Hay muchas soluciones, tales como Opciones de ejecución de archivos de imagen, enganches, sondeo usando un temporizador, usando WMI o usando un controlador. Entonces, realmente no entendí tu voto a la baja. – Hans

Cuestiones relacionadas