Benutzer mit den meisten Antworten
Zaheln hochzählen (01, 02, 03... statt 1, 2, 3..) und Millisekunden zählen

Frage
-
>Hallo.
Möchte eine Stoppuhr erstellen, die auch normal zählt.
Im Moment wird das so gezählt: 1, 2, 3, 4 usw.. Möchte aber 01, 02, 03, [...], 12, 13...
Wie stelle ich das an (in einem einfachen Label mit Timer)
Und zum 2. Problem: Ich möchte die Millisekunden hochzählen, von 0001 bis 1000 und zwar innerhalb einer Sekunde. Wie muss ich denn hier den Timer einstellen?MFG Dominik
Antworten
-
Hallo Dominik,
wenn es Dir um führende Nullen geht, so kannst Du das über Format-Anweisungen machen,
siehe ZahlenformatzeichenfolgenAls Beispiel für bis zu vier führende Nullen:
Dim watch As System.Diagnostics.Stopwatch = System.Diagnostics.Stopwatch.StartNew() For ms As Integer = 0 To 1000 Me.Label1.Text = ms.ToString("0000' ms'") 'oder 'Me.Label1.Text = String.Format("{0:0000} ms", ms) Application.DoEvents() Next watch.Stop() MessageBox.Show(String.Format("Verbrauchte Zeit: {0:0000} ms", watch.ElapsedMilliseconds))
Was den Timer bei Hochzählen von Millisekungen angeht: Da ist kaum sinnvoll.Denn zum einen kann ein Mensch so schnell gar nicht gucken.
Zum anderen haben die Timer eine Minimal-Auflösung.
Die ist beim Windows Forms Timer ca. 55 ms (aus traditionellen Gründen) -
und Einstellungen darunter werden aufgerundet.Es gibt zwar auch hochauflösendere Timer. Aber durch die Ausgabe auf den
Bildschirm wird am Ende so viel Zeit verbraucht, dass die Anzeige eher
zufällig aktualisiert würde. Und während der Zeit der Rechner nahezu
unbedienbar. Das macht also am Ende keine Sinn.Willst Du nur etwas messen und bei einigen Ereignissen die verbrauchte
Zeit ermitteln und anzeigen, so schau Dir die Stopwatch Klasse an.
(Ich habe es oben mal ins Beispiel aufgenommen)Gruß Elmar
- Bearbeitet Elmar Boye Donnerstag, 25. März 2010 20:17 Beispiel Stopwatch ergänzt
- Als Antwort vorgeschlagen Robert Breitenhofer Freitag, 26. März 2010 08:42
- Als Antwort markiert Robert Breitenhofer Mittwoch, 31. März 2010 13:40
-
Hallo Elmar,
ich habe Dein Beispiel gleich umgesetzt und verwende es jetzt. Danke.
Eine Frage: Wie verlässlich sind diese Werte in ms?
schöne Grüße
Ellen
@Dominik. Hier Deine Stoppuhr Vorsicht mit den letzten beiden Stellen. siehe oben
''' <summary> ''' Demo: Einsatz des Stopwatch zur Programmlaufzeitmessung ''' </summary> ''' <remarks></remarks> Public Class Form1 Dim watch As System.Diagnostics.Stopwatch 'Start Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click watch = System.Diagnostics.Stopwatch.StartNew() End Sub 'Stop Private Sub Button2_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button2.Click watch.Stop() TextBox1.Text = String.Format("Verbrauchte Zeit: {0:00000} ms", watch.ElapsedMilliseconds) End Sub End Class
please, mark this as answer if it is THE answer -- best regards Ellen- Bearbeitet Ellen Ramcke Sonntag, 28. März 2010 16:12
- Als Antwort markiert Dominik Klasen Montag, 5. April 2010 19:35
Alle Antworten
-
Hallo Dominik,
Deine erste Frage löst man mit einer formatierten Stringausgabe:
Dim value as Integer = 1 Dim s As String = String.Format("{0:00}", value) ' s ist "01"
Die Ausgabe ist jetzt immer 2stelligZur Frage 2. Kommt morgen. Muss ich in Ruhe checken. Geht auch
schöne Grüße
Ellen
please, mark this as answer if it is THE answer -- best regards Ellen -
Hallo Dominik,
wenn es Dir um führende Nullen geht, so kannst Du das über Format-Anweisungen machen,
siehe ZahlenformatzeichenfolgenAls Beispiel für bis zu vier führende Nullen:
Dim watch As System.Diagnostics.Stopwatch = System.Diagnostics.Stopwatch.StartNew() For ms As Integer = 0 To 1000 Me.Label1.Text = ms.ToString("0000' ms'") 'oder 'Me.Label1.Text = String.Format("{0:0000} ms", ms) Application.DoEvents() Next watch.Stop() MessageBox.Show(String.Format("Verbrauchte Zeit: {0:0000} ms", watch.ElapsedMilliseconds))
Was den Timer bei Hochzählen von Millisekungen angeht: Da ist kaum sinnvoll.Denn zum einen kann ein Mensch so schnell gar nicht gucken.
Zum anderen haben die Timer eine Minimal-Auflösung.
Die ist beim Windows Forms Timer ca. 55 ms (aus traditionellen Gründen) -
und Einstellungen darunter werden aufgerundet.Es gibt zwar auch hochauflösendere Timer. Aber durch die Ausgabe auf den
Bildschirm wird am Ende so viel Zeit verbraucht, dass die Anzeige eher
zufällig aktualisiert würde. Und während der Zeit der Rechner nahezu
unbedienbar. Das macht also am Ende keine Sinn.Willst Du nur etwas messen und bei einigen Ereignissen die verbrauchte
Zeit ermitteln und anzeigen, so schau Dir die Stopwatch Klasse an.
(Ich habe es oben mal ins Beispiel aufgenommen)Gruß Elmar
- Bearbeitet Elmar Boye Donnerstag, 25. März 2010 20:17 Beispiel Stopwatch ergänzt
- Als Antwort vorgeschlagen Robert Breitenhofer Freitag, 26. März 2010 08:42
- Als Antwort markiert Robert Breitenhofer Mittwoch, 31. März 2010 13:40
-
Hallo Elmar,
ich habe Dein Beispiel gleich umgesetzt und verwende es jetzt. Danke.
Eine Frage: Wie verlässlich sind diese Werte in ms?
schöne Grüße
Ellen
@Dominik. Hier Deine Stoppuhr Vorsicht mit den letzten beiden Stellen. siehe oben
''' <summary> ''' Demo: Einsatz des Stopwatch zur Programmlaufzeitmessung ''' </summary> ''' <remarks></remarks> Public Class Form1 Dim watch As System.Diagnostics.Stopwatch 'Start Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click watch = System.Diagnostics.Stopwatch.StartNew() End Sub 'Stop Private Sub Button2_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button2.Click watch.Stop() TextBox1.Text = String.Format("Verbrauchte Zeit: {0:00000} ms", watch.ElapsedMilliseconds) End Sub End Class
please, mark this as answer if it is THE answer -- best regards Ellen- Bearbeitet Ellen Ramcke Sonntag, 28. März 2010 16:12
- Als Antwort markiert Dominik Klasen Montag, 5. April 2010 19:35
-
Hallo Ellen,
was die Genauigkeit angeht:
Wenn IsHighResolution true ist, sind sie genau, was bei aktuellen Rechnern
i. d. R. der Fall sein sollte (Mobile Kleinst-Rechner aussen vorgelassen).Da sie direkt von der Hardware gemessen werden, sind sie nicht von den
Unwägbarkeiten einer Meldungsschleife, der Betriebssystemsreaktion etc.
abhängig.Aber potentiell kann das Bios Probleme bei Mehrkern-Prozessoren bereiten,
siehe Anmerkung zu QueryPerformanceCounter Function
(Teilweise durch die unterschiedliche Schlafzustände,
auch das Speedstepping der neusten Intel-Generation mag Einfluß haben)Einige weitere Erläuterungen findest Du bei
How It Works: SQL Server Timings and Timer Output (GetTickCount, timeGetTime, QueryPerformanceCounter, RDTSC, …)
Denn beim SQL Server werden die Funktionen zum Profiling verwendet
und die Zeitmessung hat dort eine wechselhafte Geschichte hinter sich,
da es manche es gar nicht genau genug haben können ;-)Für "normale" Messungen spielt das IMO keine Rolle.
Andere Faktoren, wie andere Prozesse, beeinflußen ein Messergebnis
wesentlich mehr als eine (kleine) Ungenauigkeit des Zählwerks.
Und systematische Fehler sind noch viel häufiger, wie heißt es so schön:
Wer misst, misst Mist ;-)Gruß Elmar
-
Hallo Elmar,
kennst Du auch diesen Satz:
Die letzten Stellen des Messinstruments dienen lediglich zur Laborbeleuchtung.
Meine Gratulation zu Deinen 4 Sternen. Ist mir neulich aufgefallen.
Ich habe schon viele Beiträge von Dir gelesen. Ich finde die fachlich alle sehr gut.
schöne Grüße
Ellen
please, mark this as answer if it is THE answer -- best regards Ellen -
Hallo.
Danke ersteinmal für eure Antworten. Was die Millisekunden anbetrifft habe ich jetzt eine andere Lösung benutzt, ich lasse den Timer einfach 10 mal 100 Millisekunden hochzählen (10 * 100 = 1000). Somit habe ich zwar nicht so genau wie ich es möchte es erfüllt aber seinen Zweck.
Gruß Dominik