none
Zaheln hochzählen (01, 02, 03... statt 1, 2, 3..) und Millisekunden zählen RRS feed

  • 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

    Donnerstag, 25. März 2010 19:35

Antworten

  • Hallo Dominik,

    wenn es Dir um führende Nullen geht, so kannst Du das über Format-Anweisungen machen,
    siehe Zahlenformatzeichenfolgen

    Als 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

    Donnerstag, 25. März 2010 20:13
  • 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
    Sonntag, 28. März 2010 12:04

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 2stellig

    Zur 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
    Donnerstag, 25. März 2010 19:58
  • Hallo Dominik,

    wenn es Dir um führende Nullen geht, so kannst Du das über Format-Anweisungen machen,
    siehe Zahlenformatzeichenfolgen

    Als 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

    Donnerstag, 25. März 2010 20:13
  • 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
    Sonntag, 28. März 2010 12:04
  • 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

    Sonntag, 28. März 2010 13:22
  • 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
    Sonntag, 28. März 2010 15:36
  • Hallo Ellen,

    ich antworte hier nicht, um Sternchen zu sammeln!
    Ich bin seit 10 Jahren in den Newgroup unterwegs gewesen,
    und dort ist alles ohne Sternenlicht und sonstiges Lametta ;-)

    Ich tue es einfach, weil es mir Spaß macht!

    Gruß Elmar

    Sonntag, 28. März 2010 16:18
  • 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

    Montag, 5. April 2010 19:37