Entwickler-Ecke
Basistechnologien - Stopwatch misst falsch
ErikLange - Mi 12.05.10 11:40
Titel: Stopwatch misst falsch
Hey Leute, ich hab ein kleines Problem.
Ich habe eine Stopwatch in mein Programm eingebaut, diese funktioniert von der Sache her auch, jedoch misst sie nicht das was ich wollte:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| static void Main(string[] args) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start();
disk k = new disk(); k.disktester();
stopwatch.Stop(); TimeSpan ts = stopwatch.Elapsed; string elepsedTime = string.Format("{0:00}:{1:00}:{2:00}:{3:00}:", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
Console.WriteLine(elepsedTime, "Runtime"); Console.ReadKey(); |
bei "k.disktester" öffenet sich ein Konsolenfenster mit einer Anwendung
Stopwatch öffnet sich also in der Konsolenanwendung und Disktester in einem neuen Fenster.
Stopwatch misst immer nur ein paar millisekunden, also scheinbar so lange wie der PC braucht um die Zeitmessung zu starten und zu stoppen. Dass da noch ein Programm läuft interessiert Stopwatch gar nicht.
Habt ihr eine Idee wie ich das lösen könnte?
MFG
Moderiert von
Kha: Topic aus C# - Die Sprache verschoben am Mi 12.05.2010 um 11:42
Kha - Mi 12.05.10 11:45
ErikLange hat folgendes geschrieben : |
| Dass da noch ein Programm läuft interessiert Stopwatch gar nicht. |
Kann man ihr nicht wirklich vorwerfen, oder ;) ?
Wie startest du denn dieses zweite Programm? Bei der
Process-Klasse gäbe es
WaitForExit.
ErikLange - Do 13.05.10 10:32
Guten Morgen
hab gar nicht mitbekommen das die Antwort so schnell kam,
ich werds ma ausprobieren, da ich das Programm wirklich über Process starte.
Aber nicht über die Feiertage, kann erst am Montag wieder an dem Programm arbeiten.
Schönen Männertag euch allen :beer:
ErikLange - Mo 17.05.10 13:21
Hey
ich hab die "WaitForExit" mal nachgeschaut, aber so richtig scheint die nicht in mein Programm zu passen.
Könntest du mir vieleicht helfen diese Methode mit reinzufügen, da ich nicht wirklich weis wo sie reingehört etc.
Wenn jemand anderes eine Idee hätte wäre ich auch sehr dankbar
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| static void Main(string[] args) {
Stopwatch stopwatch = new Stopwatch(); stopwatch.Start();
disk k = new disk(); k.disktester();
stopwatch.Stop(); TimeSpan ts = stopwatch.Elapsed; string elepsedTime = string.Format("{0:00}:{1:00}:{2:00}:{3:00}:", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10); Console.WriteLine(elepsedTime, "Runtime"); Console.ReadKey(); }
public class disk { public void disktester()
{ ProcessStartInfo disk = new ProcessStartInfo(@"D:\rdfc.exe", Path.Combine(@"d:\", "datei.txt 200 MB overwrite")); disk.WindowStyle = ProcessWindowStyle.Normal; Process.Start(disk); } } |
danielf - Mo 17.05.10 13:27
Hallo,
da dein "Programm" lediglich ein anderes Programm aufruft musst du auf das andere Programm warten. Das machst du eben mit der WaitForExit methode.
Dementsprechend musst du die disktester Methode anpassen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| public TimeSpan TestDiscSpeed(int size) { Stopwatch watch = new Stopwatch(); ProcessStartInfo disk = new ProcessStartInfo( @"D:\rdfc.exe", Path.Combine(@"d:\", string.Format("datei.txt {0} MB overwrite", size))); disk.WindowStyle = ProcessWindowStyle.Normal; watch.Start(); disk.Start(); disk.WaitForExit(); watch.Stop(); return watch.Elapsed; } |
Gruß
ErikLange - Mi 19.05.10 10:13
Ohje ich hab ewig gebraucht um zu sehen warum das nciht klappt.... bei mir hat es nie die "WaitForExit"-Methode als Vorschau angezeigt, da ich nicht die Process Klasse nutze sondern die ProcessStartInfo Klasse
Gibs da sowas ähnliches? Bzw. wäre das einfach die Klasse zu ändern?
Außerdem muss da irgendwo ein kleiner Fehler drinne sein, da die Stopuhr nun nicht mehr misst.
Wäre nett wenn ihr da ma drüber schauen könntet.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| class Program { static void Main(string[] args) {
TimeSpan ts = new TimeSpan(); string zeit = Convert.ToString(TestDiscSpeed()); zeit = string.Format("{0:00}:{1:00}:{2:00}:{3:00}:", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds); Console.WriteLine(zeit, "Runtime"); Console.ReadKey(); } static TimeSpan TestDiscSpeed() { Stopwatch watch = new Stopwatch(); disk dk = new disk(); watch.Start(); dk.disktester(); Process proc = new Process(); proc.WaitForExit(); watch.Stop(); return watch.Elapsed; } } public class disk { public void disktester()
{ ProcessStartInfo disk = new ProcessStartInfo(@"D:\rdfc.exe", Path.Combine(@"d:\", "datei.txt 100 MB overwrite")); disk.WindowStyle = ProcessWindowStyle.Normal; Process.Start(disk); }
} |
danielf - Mi 19.05.10 10:26
Oh man, das ist übel. Kennst du überhaupt die Grundlagen von Programmieren? Was eine Methode/Rückgabewert ist?
Bitte schau dir mal ein Programmierbuch wie zum Beispiel
C# [
http://openbook.galileocomputing.de/csharp/], das ist frei verfügbar, an.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| static void Main(string[] args) {
TimeSpan ts = TestDiscSpeed(); Console.WriteLine(string.Format("{4} {0:00}:{1:00}:{2:00}:{3:00}:", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds, "Runtime")); Console.ReadKey(); } |
Gruß
ErikLange - Mi 19.05.10 14:13
Hey Daniel
ich musste mir jetzt so alla Crashkurs das schnell selber beibringen, damit ich die paar Zeilen tippen kann, die theoretischen Grundlagen, was was ist etc. usw. kann ich noch nicht, da haste Recht. Ich will dann im Sommer mir richtig C# beibringen.
Diese Woche bin ich aber noch unter Druck wenigstens das halbwegs hinzubekommen.
Das Programm funktioniert nun wieder, aber halt auch nur so wie am Anfang des Threads :P
Ich GLAUBE du hattest nen kleinen Fehler bei dir drinne:
| Zitat: |
public TimeSpan TestDiscSpeed(int size)
{
Stopwatch watch = new Stopwatch();
ProcessStartInfo disk = new ProcessStartInfo(
@"D:\rdfc.exe",
Path.Combine(@"d:\", string.Format("datei.txt {0} MB overwrite", size)));
disk.WindowStyle = ProcessWindowStyle.Normal;
watch.Start();
disk.Start();
disk.WaitForExit();
watch.Stop();
return watch.Elapsed; |
disk kommt von ProcessStartInfo und dort geht scheinbar/meines Wissens die WaitForExit-Methode nicht.
Die geht nur bei Process.
Wüsstest du wie das bei ProccessStartInfo geht? Hab leider keine Idee, und meine Kenntnisse sind auch begrenzt als das ich das innerhalb ein paar Stunden einfach mal so umschreiben könnte auf Process :(
Könntest du mir vieleicht nochmal helfen? :oops:
Wenn das Programm die Woche fertig ist, kann ich auch anfangen mir C# von Grund auf beizubringen.
Th69 - Mi 19.05.10 14:21
Hallo ErikLange,
die Methode 'Process.Start(...)' gibt dir den Process zurück, also:
C#-Quelltext
1: 2:
| Process process = Process.Start(disk); process.WaitForExit(); |
Solche Grundlagen lernt man aber auch selber, wenn man in die MSDN-Dokumentation schaut...
danielf - Mi 19.05.10 14:38
Ja, das hat er ja erklärt ... also hoffentlich wird bald Sommer ;))
Hier mal eine Zusammenfassung:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| public class Drive { private const string CopyExecutable = @"D:\rdfc.exe"; private const string TempFile = @"tempfile.txt"; public string Path { get; set; }
static void Main(string[] args) { Drive driveD = new Drive(@"D:\");
TimeSpan ts = driveD.TestDiscSpeed(200);
Console.WriteLine(string.Format( "{0}MB nach {1} in {2:00}h {3:00}m {4:00}s {5:00}ms kopiert ({6}MB/sec).", 200, driveD, ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds, 200 / ts.TotalSeconds)); Console.ReadKey(); }
public Drive(string path) { Path = path; }
public TimeSpan TestDiscSpeed(int mb) { Stopwatch watch = new Stopwatch(); Process proc = new Process { StartInfo = new ProcessStartInfo( CopyExecutable, System.IO.Path.Combine(Path, TempFile + " " + mb + " MB overwrite")) };
watch.Start(); proc.Start(); proc.WaitForExit(); watch.Stop(); return watch.Elapsed; } } |
ErikLange - Mi 19.05.10 14:55
Also ich muss sagen... ich bin beeindruckt, es funktioniert auf Anhieb.
Es ist zwar ganz anders als meins, deshalb warscheinlich auch richtig :P aber findes cool das ich nun doch was vorzuzeigen hab.
Nun noch eine kleine Schleife einbauen (damit der Test 5ma abläuft und man den Mittelwert ausrechnen kann) , das müsste ich noch hinbekommen ^^
Da bedanke ich mich ma und werde mir ma ne Weile das Programm anschauen und dadurch mein Verständnis für die Sprache erweitern.
:)
DANKE :!:
danielf - Mi 19.05.10 15:07
Besser wäre es, wenn du die Funktionalität von rdfc.exe in einer .NET Methode abbildest (beliebig Daten erzeugen und in die Datei schreiben). Dann wärst du nicht auf diesen externen Teil angewiesen und das Programm ist nicht so Fehler anfällig. Das kannst du dir ja für den Sommer vornehmen ;)
Viel Erfolg
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!