ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 02.11.2000

Diese Seite wurde zuletzt aktualisiert am 02.11.2000
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicAddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zur AVB-Web-Site, Kontakt und Impressum

Zurück...

Stoppuhr

Zurück...

(-hg) mailto:hg_stopwatch@aboutvb.de

Eine wesentlich exaktere Zeitmessung als mit der Visual Basic-eigenen Timer-Funktion erlaubt der Windows-Multimedia-Timer. Er erreicht eine millisekundengenaue Auflösung.

Eigentlich reicht ja ein Aufruf-Paar der MSDN Library - API timeGetTimetimeGetTime-Funktion vollauf: ein Aufruf zum Beginn der Zeitmessung und ein zweiter Aufruf zum Stoppen der Messung. Die Differenz der Rückgabewerte beider Aufrufe ergibt die verstrichene Zeit in Millisekunden.

Private Declare Function GetTime Lib "winmm.dll" _
 Alias "timeGetTime" () As Long

Private mStartTime As Long

Private Sub Command1_Click()
  mStartTime = GetTime
End Sub

Private Sub Command2_Click()
  Debug.Print "Verstrichene Zeit: " & (GetTime - mStartTime)
End Sub

Aber warum so einfach, wenn es auch komfortabler geht? Der Komfort besteht darin, die Verwaltung in eine Klasse zu packen, die wir clsStopWatch genannt haben. Die Methode StartWatch startet die Stoppuhr - d.h. sie merkt sich die aktuelle Zeit des Multimedia-Timers und gibt sie auch gleich als Rückgabewert des Methoden-Aufrufs (Funktion) zurück.

Private pInterval As Long
Private pStartTime As Long
Private pStopTime As Long

Public Function StartWatch() As Long
  pStopTime = 0
  pStartTime = GetTime
  StartWatch = pStartTime
End Function

Mit einem Aufruf der Methode StopWatch wird wieder die aktuelle Zeit des Multimedia-Timers ermittelt. Über den optionalen Parameter ReturnStopTime können Sie festlegen (Wert gleich True), dass Sie als Rückgabewert die Stopp-Zeit erhalten. Ist der Wert gleich False, oder lassen Sie den Parameter weg, erhalten Sie als Rückgabewert gleich die zwischen Start und Stopp verstrichene Zeit in Millisekunden. Im ersten optionalen Parameter Restart legen Sie fest, ob die Stoppuhr gleich erneut gestartet wird. So genügt jedes Mal ein Aufruf von StopWatch, um fortlaufend Intervalle zwischen einer ganzen Reihe von Messzeitpunkten zu ermitteln.

Public Function StopWatch(Optional ByVal Restart As Boolean, _
 Optional ByVal ReturnStopTime As Boolean) As Long

  pStopTime = GetTime
  pInterval = pStopTime - pStartTime
  If Restart Then
    pStartTime = pStopTime
  End If
  If ReturnStopTime Then
    StopWatch = pStopTime
  Else
    StopWatch = pInterval
  End If
End Function

Sowohl die Start-Zeit, die Stopp-Zeit und die verstrichene Zeit können Sie über die Eigenschaften StartTime, StopTime und Interval auch später noch auslesen. Beachten Sie, dass die Eigenschaft StartTime mit der zuletzt ermittelten Stopp-Zeit identisch ist, wenn in StopWatch die Stoppuhr erneut gestartet worden ist - die jeweils vorhergehende Start-Zeit im Laufe einer Messreihe geht verloren.

Public Property Get StartTime() As Long
  StartTime = pStartTime
End Property

Public Property Get StopTime() As Long
  StopTime = pStopTime
End Property

Public Property Get Interval() As Long
  Interval = pInterval
End Property

Für einfache Kurzzeit-Messungen mag die Ermittlung der verstrichenen Zeit in Millisekunden praktisch und ausreichend sein. Sie können den Millisekunden-Wert auch in die entsprechenden Anteile von Millisekunden, Sekunden, Minuten und Stunden umrechnen lassen. Die Methode IntervalParts liefert Ihnen diese Anteile entweder vom zuletzt ermittelten Stoppuhr-Intervall, oder von einem beliebigen anderen Millisekunden-Wert, den Sie alternativ im optionalen Parameter ThisInterval übergeben können. Welche Anteile Sie zu erhalten wünschen, bleibt Ihnen überlassen. Das bestimmen Sie, indem Sie entsprechend vorab dimensionierte Variablen in den Parametern MilliSeconds, Seconds, Minutes oder Hours übergeben bzw. einfach weglassen. Lassen Sie beispielsweise den Hours-Parameter aus, wird der Stunden-Anteil umgerechnet den Minuten zugeschlagen. Lassen Sie auch diesen Parameter weg, wird der Minuten-Anteil den Sekunden zugeschlagen - und so weiter, vom größten zum jeweils kleiner werdenden Wert abgestuft. Lassen Sie jedoch einen Parameter "von unten her" weg, also etwa MilliSeconds, wird der jeweilige Anteil gerundet. Sind es weniger als 500 Millisekunden, entfällt der Anteil, sind es 500 oder mehr Millisekunden, wird die Anzahl der Sekunden um 1 erhöht (Aufrundung). Bei Sekunden und Minuten gilt entsprechend eine Schwelle von 30. Sie können allerdings nur Parameter "von unten her" oder (auch gleichzeitig) "von oben her" weglassen. Wenn Sie zwischen zwei Parametern eine Lücke lassen und etwa nur MilliSeconds und Minutes übergeben, werden Sie sinnlose Werte zurückbekommen.

Public Sub IntervalParts(Optional MilliSeconds As Variant, _
 Optional Seconds As Variant, Optional Minutes As Variant, _
 Optional Hours As Variant, Optional ByVal ThisInterval As Long)

  Dim nInterval As Long
  Dim nMilliSeconds As Long
  Dim nSeconds As Long
  Dim nMinutes As Long
  Dim nHours As Long
  Dim nAdd As Integer
  
  If ThisInterval Then
    nInterval = Abs(ThisInterval)
  Else
    nInterval = pInterval
  End If
  nMilliSeconds = nInterval Mod 1000
  nInterval = (nInterval - nMilliSeconds) \ 1000
  nSeconds = nInterval Mod 60
  nInterval = (nInterval - nSeconds) \ 60
  nMinutes = nInterval Mod 60
  nInterval = (nInterval - nMinutes) \ 60
  nHours = nInterval
  If IsMissing(MilliSeconds) Then
    If nMilliSeconds >= 500 Then
      If Not IsMissing(Seconds) Then
        nSeconds = nSeconds + 1
      End If
    End If
  End If
  If IsMissing(Seconds) Then
    If nSeconds >= 30 Then
      If Not IsMissing(Minutes) Then
        nMinutes = nMinutes + 1
      End If
    End If
  End If
  If IsMissing(Minutes) Then
    If nMinutes >= 30 Then
      If Not IsMissing(Hours) Then
        nHours = nHours + 1
      End If
    End If
  End If
  If IsMissing(Hours) Then
    nMinutes = nMinutes + nHours * 60
  End If
  If IsMissing(Minutes) Then
    nSeconds = nSeconds + nMinutes * 60
  End If
  If IsMissing(Seconds) Then
    nMilliSeconds = nMilliSeconds + nSeconds * 1000
  End If
  MilliSeconds = nMilliSeconds
  Seconds = nSeconds
  Minutes = nMinutes
  Hours = nHours
End Sub

Zum Abschluss noch ein kleines Beispiel für die Verwendung der Klasse clsStopWatch:

Private mStopWatch As clsStopWatch

Private Sub Form_Load()
  Set mStopWatch = New clsStopWatch
End Sub

Private Sub Command1_Click()
  mStopWatch.StartWatch
End Sub

Private Sub Command2_Click()
  Dim nHours As Long
  Dim nMinutes As Long
  Dim nSeconds As Long
  Dim nMilliSeconds As Long

  With mStopWatch
    .StopWatch
    .IntervalParts nMilliSeconds, nSeconds, nMinutes, nHours
  End With
  Debug.Print "Vergangen sind:"
  Debug.Print nHours; " Stunden"
  Debug.Print nMinutes; " Minuten"
  Debug.Print nSeconds; " Sekunden"
  Debug.Print nMilliSeconds; " Millisekunden"
End Sub

Die Klasse clsStopWatch (clsStopWatch.zip - ca. 3 KB)



Komponenten-Übersicht

Schnellsuche



Zum Seitenanfang

Copyright © 1999 - 2023 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...