Announcement

Collapse
No announcement yet.

Ausgabe des stopwatch controls formatieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Ausgabe des stopwatch controls formatieren

    Hallo zusammen,

    bei mir wird im Programm angezeigt, wie lange es noch dauert, bis alles abgearbeitet ist.
    Code:
    Label18.Text = oTime.ElapsedMilliseconds / 1000 * P / 60
    wobei oTime das stopwatch control ist und P der Multiplikator(Anzahl der Schleifendurchläufe).
    Funktioniert auch soweit, allerdings sieht die Ausgabe der verbleibenden Zeit ziemlich doof aus. Ungefähr so: 32.8483675 Minuten
    Wie kann ich diese Ausgabe sinnvoll formatieren, so dass entweder nur die verbleibenden Minuten ohne Nachkommastellen oder im Format 00:00 die Min & Sek angezeigt werden?
    Die Stopwatch misst ja die Zeit, die für das Abarbeiten der Schleife benötigt wird und multipliziert diese dann mit der Anzahl der verbleibenden Loops.
    So etwas wie:
    Code:
    ...
    Label18.Text = String.Format("{0:00}:{1:00}:{2:00}:{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10)
    ...
    zeigt die Zeit zwar im richtigen Format an, allerdings nur die Zeit, die für den aktuellen Loop-Durchlauf benötigt wurde. Es fehlt dann im Prinzip noch der Multiplikator - und genau da weiß ich nicht, wo ich ihn anhängen soll :-(

    Am Einfachsten wäre es wahrscheinlich, den ausgegeben Wert um alle Nachkommastellen zu bereinigen... Oder hat vielleicht jemand eine bessere/einfachere Idee? Bin für jeden Hinweis dankbar!

  • #2
    Füll dein berechneten Wert in einen TimeSpan zum Beispiel mit der FromMilliseconds Methode. Im Anschluss kannst du dann der TimeSpan.ToString() ein Format mitgeben wie der auszugebende string denn auszusehen hat.

    Comment


    • #3
      Hmmm... das versteh ich jetzt nicht so richtig. Auf timespan.tostring bin ich in der MSDN auch schon gestossen, kann allerdings nicht wirklich viel damit anfangen. Die Ausgabe wird ja in der Variante mit timespan korrekt formatiert angezeigt, allerdings müsste das angezeigte Ergebnis eben noch mit der bekannten Anzahl der Schleifendurchläufe multipliziert werden(was allerdings leider scheinbar nicht geht - bzw. ich weiß nicht wie es geht) Hast du vielleicht einen kurzen Beispielcode irgendwo dazu?

      Comment


      • #4
        Ich weiß nicht genau was deine Umrechnung macht aber ich hätte gedacht das du das machst bevor du das TimeSpan Object befüllst. Danach hätte ich TimeSpan nur noch zum formatieren verwendet.

        Comment


        • #5
          Also das ist die Variante ohne timespan, Ergebnis wird mir in verbleibenden Minuten inklusive gefühlten 5000 Nachkommastellen angezeigt:
          Code:
          Dim oTime As Stopwatch
                ...
                   oTime.Start()
          ...
          hier kommt jetzt der Inhalt der Schleife
          ...
          oTime.Stop()
          Label18.Text = oTime.ElapsedMilliseconds / 1000 * P / 60
          ... wobei P die Anzahl der Loops ist
          Loop
          Die andere Variante mit timespan sieht so aus:
          Code:
          Dim ts As TimeSpan
                          ts = oTime.Elapsed
          Dim elapTime As String = String.Format("{0:00}:{1:00}:{2:00}:{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10)
          Dim Zeit As String = elapTime 
          Label18.Text = CStr(Zeit)
          Diese Variante zeigt die für einen Schleifendurchlauf benötigte Zeit korrekt formatiert an.
          Wenn ich jetzt bei der 2.Variante hinter elaptime oder zeit einfach "* P" zum Multiplizieren der bis jetzt benötigten Zeit mit der Anzahl der noch zu durchlaufenden Schleifen anhängen könnte und es würde wie gewünscht dargestellt wäre alles bestens ;-) Geht aber leider nicht :-( oder ich weiß einfach nicht wie.... die ermittelte, angezeigte Zeit muss also mit der - bei jedem Durchlauf abnehmenden - noch zu durchlaufenden Schleifenanzahl bei jedem Durchlauf multipliziert werden...

          Comment


          • #6
            Kann es sein, dass du etwas zu sehr um die Ecke denkst?

            StopWatch.Elapsed liefert direkt einen TimeSpan, der muss nur noch wunschgemäß formatiert werden. Bei deiner "anderen Variante" machst du mit String.Format den gewünschten String, den weist du einem weiteren String, den konvertierst du in einen String. Ein String ist ein String ist ein String! Also sollte dies genügen:
            [highlight=vbnet]Label18.Text = String.Format("{0:00}:{1:00}:{2:00}:{3:00}", _
            oTime.Elapsed.Hours, oTime.Elapsed.Minutes, _
            oTime.Elapsed.Seconds, oTime.Elapsed.Milliseconds / 10)[/highlight]
            Wozu die Anzahl der Schleifendurchgänge zusätzlich berücksichtigt werden soll, verstehe ich allerdings nicht.

            Hast du zur Kenntnis genommen, dass Stop und Start die Zeit kumulativ messen?

            Nebenbei solltest du andere Namen benutzen, etwas wie Label18 gehört verboten. Siehe .NET Richtlinien für Namen oder (als Kurzfassung) [wikibooks] .NET-Namenskonventionen.

            Gruß Jürgen

            Comment


            • #7
              Hallo Jürgen,
              sowas wie Label18 steht nur in den Testsachen, in den normalen Programmen sind schon die korrekten Bezeichnungen, sonst würde ich da selbst nicht mehr durchsehen ;-)
              Daß stopwatch die Zeit kumuliert weiß ich schon das nützt mir nur nix. Deswegen soll ja auch die Anzahl der verbleibenden Schleifendurchläufe berücksichtigt werden: es soll die verbleibende Zeit für die restlichen zu verarbeitenden Datensätze angezeigt werden. Dadurch, dass start und stop der stopwatch am Anfang bzw. Ende der Schleife stehen, wird bei jedem Loop die für den aktuellen Datensatz benötigte Zeit gestoppt. Die wird mit der Anzahl der noch zu verarbeitenden Datensätze multipliziert und ergibt damit die für die restlichen Datensätze noch benötigte Zeit. Da ja mit jedem Loop auch die Anzahl der noch zu verarbeitenden Datensätze - und damit der Multiplikator - abnimmt, zeigt das Label dann die verbleibende Restzeit. Ich hoffe, ich konnte das so einigermaßen verständlich erklären ;-)

              Das von dir geschriebene Beispiel ist natürlich kürzer und ich weiß, dass ich recht häufig "um die Ecke" denke, aber auch diese Variante zeigt mir nur die benötigte Zeit für den aktuellen Datensatz an, nicht die verbleibende für alle. Das würde erst funktionieren, wenn man die angezeigte Zeit auf alle Restlichen hochmultipliziert - nur wie?? Oder übersehe ich da irgendeine Möglichkeit wie es noch geht?

              Comment


              • #8
                Wie genau du von einem Durchgang auf alle hochrechnen willst, musst du noch überlegen. Aber grundsätzlich geht es über einen passenden TimeSpan-Konstruktor:
                [highlight=vbnet]TimeSpan ts = new TimeSpan(oTime.Elapsed.Ticks * P)
                label18.Text = String.Format("{0:00}:{1:00}:{2:00}:{3:00}", _
                ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10)[/highlight]
                Gruß Jürgen

                PS. Dein Hinweis auf die Namen beruhigt mich.

                Comment


                • #9
                  Hallo Jürgen,

                  genau das war es, was ich gesucht habe: die korrekte Position meines Multiplikators P. So ist das Ergebnis perfekt, besser gehts nicht! Vielen Dank für deine Hilfe!!!!! :-)

                  Comment

                  Working...
                  X