Start / Tipps / VB 5/6-Tipp 0011: Genaue Zeitmessungen (0.00083 ms Auflösung)
 
Startseite Up-/Download Tutorials Club Das Team
Rubriken Foren Bücher Tips 'n Tricks Suche


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


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 2 Verwendete API-Aufrufe:
QueryPerformanceCounter, QueryPerformanceFrequency
Download des Beispielprojektes Download des Beispielprojektes [2,78 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 --------------
Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?
Ja, funktioniert! Windows-Version:
Nein, funktioniert nicht bei mir! VB-Version:

Ihre Meinung

Falls Sie Fragen zu oder Erfahrungen mit diesem Tipp haben, dann sollten Sie diese hier posten. Für alles weitere melden Sie sich bitte in einem zum Thema passendem Forum.

Falls Sie in ihren Kommentar Quellcode einbinden wollen, verwenden Sie bitte Pseudotags: Quellcode für VB5/VB6 wird durch ein vorangestelltes [code] markiert und durch [/code] abgeschlossen.

Ihr Name:   
Ihre E-Mailadresse:   
 
Bitte folgende Kontrollnummer eingeben: 2997
Kontrolle:   
 
Ihre Frage/Ihr Kommentar:
Ja, ich möchte weitere Beiträge per E-Mail erhalten
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
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.
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.
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.
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
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
Von Martin am 05.05.2004 um 17:45
Wieviele Sekunden kann der Counter maximal laufen? (Grösse Datentyp Double?)
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
Von p.sauer am 01.07.2001 um 10:13
Super aktuelle, verständliche und stabile Beispiele. Weiter so

Erstellt: 15.06.2003
Aktualisierung: 15.06.2003
  Autor: ActiveVB
E-Mail: Tipps@ActiveVB.de



Copyright © 1998-2010 by ActiveVB
Alle Rechte vorbehalten.