presumo da The only thing I would like to get is Time.
si intende l'ora di inizio e fine di ogni processo
Il modo migliore sarà che dovrai costruirti quella storia. Se hai bisogno della cronologia solo quando la tua applicazione è in esecuzione, devi semplicemente implementare il codice qui sotto, altrimenti se desideri creare la cronologia per un certo periodo anche quando l'applicazione non funziona, prova a creare un servizio Windows che faccia il lavoro per te. Di seguito sono riportati i passi che devi fare a patto di saper come creare un progetto di servizio Windows, compilarlo ed installarlo:
Ottenere i processi in esecuzione informazioni:
using System;
using System.Diagnostics;
public static class ProcessStart
{
Process[] runningProcesses;
var processesStartTimes = new Dictionary<int, Datetime>();
var processesExitTimes = new Dictionary<int, Datetime>();
static ProcessStart()
{
// This will get current running processes
runningProcesses = Process.GetProcesses();
foreach (var p in processes)
{
p.Exited += new EventHandler(ProcessExited);
processesStartTimes.Add(p.Id, p.StartTime);
}
}
private void ProcessExited(object sender, System.EventArgs e)
{
var p = (Process)sender;
processesExitTimes.Add(p.Id, p.ExitTime);
}
}
Come processi nuova iniziate
È necessario creare un nuovo oggetto Timer
ed eseguirlo ogni secondo per verificare i nuovi processi creati. Ho copiato il codice di cui sopra e l'ha estesa:
public static class ProcessStart
{
Process[] runningProcesses;
var processesStartTimes = new Dictionary<int, Datetime>();
var processesExitTimes = new Dictionary<int, Datetime>();
var updateTimer = new Timer(1000);
static ProcessStart()
{
// This will get current running processes
runningProcesses = Process.GetProcesses();
foreach (var p in processes)
{
p.Exited += new EventHandler(ProcessExited);
processesStartTimes.Add(p.Id, p.StartTime);
}
updateTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
}
private void ProcessExited(object sender, System.EventArgs e)
{
var p = (Process)sender;
processesExitTimes.Add(p.Id, p.ExitTime);
}
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
runningProcesses = Process.GetProcesses();
foreach (var p in processes)
{
// This will only add the processes that are not added yet
if (!processesStartTimes.Keys.Contains(p.Id))
{
p.Exited += new EventHandler(ProcessExited);
processesStartTimes.Add(p.Id, p.StartTime);
}
}
}
}
Infine:
È proprio in quel momento bisogno di giocare con la classe System.Diagnostics.Process
. Questo dovrebbe essere il modo migliore per ottenere tutte le informazioni necessarie sui processi di Windows. Vi garantirà l'accesso a una vasta gamma di proprietà e metodi. Ecco l'MSDN lik ufficiale per esso:
Process Class
EDIT:
Come posso vedere dal tuo commento, siete interessati a tempo CPU hanno trascorso l'esecuzione di un processo specifico. La stessa classe System.Diagnostics.Process
contiene anche queste informazioni. Questo può essere trovato usando la proprietà Process.PrivilegedProcessorTime
. La descrizione MSDN per questa proprietà è:
Un TimeSpan che indica il tempo impiegato dal processo per eseguire il codice all'interno del core del sistema operativo.
Maggiori informazioni Here
EDIT 2:
I 2 Beni seguenti potrebbero anche dare probabilmente quello che vi serve:
Process.UserProcessorTime
: Here
un periodo che indica la quantità di tempo che il processo associato ha trascorso in esecuzione codice all'interno della parte dell'applicazione del processo (non all'interno del core del sistema operativo).
Process.TotalProcessorTime
: Here
un periodo che indica la quantità di tempo che il processo associato ha speso utilizzando la CPU. Questo valore è la somma di UserProcessorTime
e PrivilegedProcessorTime
.
Bella risposta! Quello sarebbe il meglio che può ottenere, ma non gli permetterà di ottenere il tempo CPU per ogni modulo che è l'informazione che sta cercando. Questo fornisce solo l'elenco di moduli o "Processi" –
Con queste informazioni posso creare le mie statistiche che sono probabilmente le migliori che posso ottenere :) –
Suppongo che anche il task manager di Windows 8 "solo" ottenga il tempo della CPU da il processo host dell'app. Poiché ogni app genera un nuovo processo, non vedo perché i valori dovrebbero differire. – typ1232