Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0011: Genaue Zeitmessungen (0.00083 ms Auflösung)

 von 

Beschreibung 

Diese kleine Programm kann als Stopuhr eingesetzt werden. Es handelt sich um einen Highresolution-Timer (Genauigkeit 0,00083 ms) der als Klasse angelegt ist. Um ihn zu betreiben muß lediglich diese Klasse in ein Projekt einfügt werden.Dieser Timer bietet entgegen dem bereits in VB integrierten Timer-Control (Auflösung ca. 55 ms) eine bessere Auflösung und Laufsicherheit.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

QueryPerformanceCounter, QueryPerformanceFrequency

Download:

Download des Beispielprojektes [2,92 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Schaltfläche "Command2"
' Steuerelement: Schaltfläche "Command1"

Option Explicit

'Deklaration: Globale Form-Variablen
Dim xTimer As New xTimer

Private Sub Command1_Click()
    xTimer.Calibrieren
    xTimer.Start
End Sub

Private Sub Command2_Click()
    xTimer.Halt
    ShowTime
End Sub

Private Sub Form_Load()
    'Control-Eigenschaften initialisieren
    Command1.Caption = "Start"
    Command2.Caption = "Stop"
End Sub

Private Sub ShowTime()
    MsgBox "Zeitmessung: " & Format(xTimer.RunTime, "0.00 ms")
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'--------- Anfang Klasse "xTimer" alias Class1.cls  ---------

Option Explicit

'Deklaration: Globale Klassen API-Typen
Private Type LARGE_INTEGER
    Lo As Long
    Hi As Long
End Type

'Deklaration: Globale Klassen API-Funktionen
Private Declare Function QueryPerformanceCounter Lib "kernel32" ( _
    lpPerformanceCount As LARGE_INTEGER) As Long

Private Declare Function QueryPerformanceFrequency Lib "kernel32" ( _
    lpFrequency As LARGE_INTEGER) As Long

'Deklaration: Globale Klassen-Variablen
Dim dblCalibrieren As Double

Dim udtStart As LARGE_INTEGER
Dim udtEnde As LARGE_INTEGER
Dim udtFreq As LARGE_INTEGER

Public Sub Calibrieren()
    Call QueryPerformanceCounter(udtStart)
    Call QueryPerformanceCounter(udtEnde)

    dblCalibrieren = (D(udtEnde) - D(udtStart)) / D(udtFreq) * 1000
End Sub

Private Sub Class_Initialize()
    Call QueryPerformanceFrequency(udtFreq)
End Sub

Public Sub Halt()
    Call QueryPerformanceCounter(udtEnde)
End Sub

Public Sub Start()
    Call QueryPerformanceCounter(udtStart)
End Sub

Public Property Get RunTime() As Double
    RunTime = (D(udtEnde) - D(udtStart)) / D(udtFreq) * 1000 - dblCalibrieren
End Property

Private Function D(udtX As LARGE_INTEGER) As Double
    'Deklaration: Lokale Prozedur-Variablen
    Dim dblHigh As Double
    Dim dblLow As Double

    dblLow = udtX.Lo
    dblHigh = udtX.Hi

    If dblLow < 0 Then
        dblLow = 4294967296# + dblLow + 1
    End If

    If dblHigh < 0 Then
        dblHigh = 4294967296# + dblHigh + 1
    End If

    D = dblLow + dblHigh * 4294967296#
End Function


'---------- Ende Klasse "xTimer" alias Class1.cls  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 9 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Franzelot am 03.09.2008 um 10:24

Hallo,
ich bin kein VB Programmierer möchte aber trotzdem wenn möglich mit einem Tool (jedoch nicht mit manueller Stoppuhr) den Zeitbedarf ermitteln der erforderlich ist um eine bestimmte Datei zu öffnen. Es geht um einen Vergleich Dateiöffnungszeit auf bei Dateiablage auf Server und bei Dateiablage lokal.
Würde mich freuen wenn ihr mir einen Tipp geben könntent.
Es handelt sich um Solidworksdateien.

Danke

Kommentar von Arne Kühlcke am 30.07.2008 um 13:45

Der Tip ist gut, kann aber auch wesentlich einfacher gestaltet werden. Anstatt der Verrenkung mit dem selbstgebauten LARGE_INTEGER kann man auch den Datentyp Currency verwenden und das Ergebnis mal 10000 nehmen.

Kommentar von Jonthan am 10.03.2008 um 16:46

Ich finde es ganz toll, dass es so einen Timer gibt, der so eine Genauigkeit bsitzt. Lob von meiner Seite.

Kommentar von Bernd Schulze am 11.09.2005 um 18:16

Code sieht sauber aus und funktioniert auch. Aber ich begreife leider nicht die Funktion D, insbesondere was es mit

dblLow = 4294967296# + dblLow + 1
(u.s.w.)auf sich hat. Was genau geschieht da?

Mit freundlichen Grüßen Bernd Schulze.

Kommentar von Timo am 01.08.2005 um 14:05

Probier mal meinen Timer. Ist ein komplettes Projekt.
http://www.activevb.de/cgi-bin/upload/download.pl?id=2237
Ist auch ohne die API's gelöst. Ich finds einfacher. Ist auch auf 0.00083ms genau. Timo

Kommentar von Timo am 24.11.2004 um 09:24

Hmmm. Dieser Tip kommt mir doch seeehhhr bekannt vor. OK, der Code ist sauberer gelöst als bei mir, dafür mit API.

Schöne Grüsse

Timo

Kommentar von Martin am 05.05.2004 um 17:45

Wieviele Sekunden kann der Counter maximal laufen? (Grösse Datentyp Double?)

Kommentar von Erhard.Himmler am 28.09.2003 um 19:13

Hallo zusammen,

mit Interesse habe ich den Tipp getestet.

Frage:
Ich möchte die Stoppuhr in mein Programm integrieren und zwar im Format Stunden,Minute,Sekunden,Zentelsekunden

also z.B. so 01:30:45.6 wo und wie ist das Programm zu ändern.

Herzlichen Dank im Voraus!!

MFG.

E.Himmler

Kommentar von p.sauer am 01.07.2001 um 10:13

Super aktuelle, verständliche und stabile Beispiele. Weiter so