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 timeGetTime-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
|