C# Laufzeit eines Prozess ermitteln

Fonce

Captain
Registriert
Feb. 2006
Beiträge
3.380
Hi,
ich schreibe derzeit ein Programm mit dem ich aufzeichen möchte wie lange ich bestimmte Anwendungen genutzt habe.
Die Erkennung ob ein Programm läuft hab ich schon geschrieben. Ich komme allerdings nicht weiter bei der Aufzeichnung der Laufzeit des Programms. Ich finde auch im INet nicht passendes.

Kann mir da vielleicht jemand weiterhelfen?
 
Dein Programm wird ja vermutlich in einem bestimmten Intervall prüfen ob die besagten Dienste laufen.

Dann sicherst du einfach in einem Logfile wann das Programm gestartet ist, und eben wann der dienst nicht mehr läuft.
 
Guck dir mal die Klasse System.Diagnostics.Process an, die liefert dir reichlich Informationen über ein Programm/Prozess, u.a. die Laufzeit.
 
Code:
System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessesByName( "foo" )[0];
double runtime = (p.ExitTime - p.StartTime).TotalSeconds;
ka ob TotalSeconds stimmt.
 
Ich nehme an du hast ein System.Diagnostics.Process Object. Dort kannst du entweder process.WaitForExit() verwenden oder regelmässig process.ExitTime abfragen.
 
Habe mir jetzt mal folgendes zusammengebastelt

PHP:
public static bool CheckProcessIsRun(string sProcessName){
			return (System.Diagnostics.Process.GetProcessesByName(sProcessName).Length > 0);
		}

        bool wasRunning = false;

        private void timer1_Tick(object sender, EventArgs e)
        {
            String sProcessName = "calc";
            bool b = CheckProcessIsRun(sProcessName);
            if (b)
            {
                if (!wasRunning)
                {
                    start = DateTime.Now;
                    wasRunning = true;
                }
            }
            else
            {
                if (wasRunning)
                {
                    end = DateTime.Now;
                    duration = duration + (end - start);
                    textBox1.Text = duration.TotalSeconds.ToString();
                    wasRunning = false;
                }
            }
        }

So kann ich allerdings immer nur eine Anwendung prüfen. Bei meinem Programm wären es aber mehrere Programme die zu prüfen sind.
 
dein pseudocode hat nicht ansatzweise was mit c#, sondern eher mit c++ zu tun und hilft denke ich bei seiner fragestellung wenig, da er sicher schon darauf gekommen ist eine differenz zu errechnen, bloß bisher nicht uwsste woher er die zeiten nehmen soll

würde zwar eher

System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessesByName("foo")[0];
double runtime = (p.ExitTime.Subtract(p.StartTime)).TotalSeconds;

benutzen, aber das von claW. macht kaum einen unterschied und sollte anstandslos funktionieren :P
 
Zuletzt bearbeitet:
BloodHunter2k8 schrieb:
dein pseudocode hat nicht ansatzweise was mit c#, sondern eher mit c++ zu tun und hilft denke ich bei seiner fragestellung wenig, da er sicher schon darauf gekommen ist eine differenz zu errechnen, bloß bisher nicht uwsste woher er die zeiten nehmen soll

würde zwar eher

System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessesByName("foo")[0];
double runtime = (p.ExitTime.Subtract(p.StartTime)).TotalSeconds;

benutzen, aber das von claW. macht kaum einen unterschied :P

claW. schrieb:
Code:
System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessesByName( "foo" )[0];
double runtime = (p.ExitTime - p.StartTime).TotalSeconds;
ka ob TotalSeconds stimmt.

Das funktioniert aber nicht so wie es sollte. Er gibt mir dann folgende Fehlermeldung aus

Code:
Der Index war außerhalb des Arraybereichs.
 
dann hat er keinen prozess gefunden
Ergänzung ()

verwende

Process p = Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName)[0];

um den aktuellen prozess (der der das ausführt) zu erhalten
Ergänzung ()

ansonsten kannst du auch GetProcessById
benutzen, falls du die pid irgendwo her bekommst?
 
Zuletzt bearbeitet:
BloodHunter2k8 schrieb:
dann hat er keinen prozess gefunden
Ergänzung ()

verwende

Process p = Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName)[0];

um den aktuellen prozess (der der das ausführt) zu erhalten
Ergänzung ()

ansonsten kannst du auch GetProcessById
benutzen, falls du die pid irgendwo her bekommst?

Also es geht mir schon um Prozesse die mit dir Anwendung ansich nichts zu tun haben!
wenn ich wissen wollte wie lange die aktuelle Anwendung läuft bräuchte ich ja nur nen Timer der einen Wert nach gewünschtem Intervall hochzählt.^^
 
sicher könnte man das auch über nen timer lösen, aber wozu gibts dann die diagnostics.process klasse? :P

http://msdn.microsoft.com/en-us/library/z3w4xdc9.aspx

poste doch mal deinen code den du jetzt hast?
Process[] p = Process.GetProcessesByName("notepad");
foreach (Process _p in p)
{
Console.WriteLine((DateTime.Now - _p.StartTime).TotalSeconds);
}
Console.ReadLine();

funktioniert bei mir perfekt?
was für einen wert übergibst du denn?
Ergänzung ()

man muss übrigens DateTime.Now - p.StartTime() machen, ExitTime funktioniert nicht
 
Zuletzt bearbeitet:
Danke, das ist ja endlich mal Code der auch funktioniert^^.
macht genau das was ich wollte, nur in nen Timer muss ich es trotzdem noch packen, den ich muss ja schließlich irgendwie in bestimmten Abständen prüfen ob die Programme noch laufen. ;)
Wenn ich das ganze fertig für mehrere Programme geschrieben habe gibt es hier natürlich den entsprechenden Code ;)
 

Ähnliche Themen

Zurück
Oben