Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0358: Längere Timerzeiten mit API-Timer

 von 

Beschreibung 

Wozu ein Timer mit APIs? Die Frage ist durchaus berechtigt. Da diese Art von Timer im wesentlichen dem VB-eigenen entspricht. Zudem ist sein Handling umständlicher, da Debuggen hier gefährlich und da er nicht als Objekt bequem ansprechbar ist. In letzterem Punkt liegt aber auch sein wesentlicher Vorteil. So ist es mit ihm möglich Timerfunktionalität auch in Module einzubinden. Dies ist sinnig, wenn auf eine Oberfläche verzichtet werden soll/muß. Unter solchen Gegebenheiten ist der VB-Timer nicht nutzbar, da er ein Objekt ist das eines Formulars bedarf. Zudem hat dieser Timer den Vorteil wesentlich größere Intervalle als die standardmäßigen maximal 65,5 Sekunden zu bieten. Es sind Zeitspannen von bis zu mehreren Tagen möglich.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

KillTimer, SetTimer

Download:

Download des Beispielprojektes [2,7 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"
' Steuerelement: Beschriftungsfeld "Label1"
' Steuerelement: Beschriftungsfeld "Label2"

Option Explicit

Private Sub Command1_Click()
  If Not TimerEnabled Then
    Call Init(100)
    Command1.Enabled = False
    Command2.Enabled = True
  End If
End Sub

Private Sub Command2_Click()
  If TimerEnabled Then
    Call Terminate
    Command1.Enabled = True
    Command2.Enabled = False
  End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
  If TimerEnabled Then Call Terminate
End Sub

'---------- Ende Formular "Form1" alias Form1.frm  ----------
'--------- Anfang Modul "Module1" alias Module1.bas ---------

Option Explicit

Private Declare Function SetTimer Lib "user32" (ByVal hWnd As _
        Long, ByVal nIDEvent As Long, ByVal uElapse As Long, _
        ByVal lpTimerFunc As Long) As Long

Private Declare Function KillTimer Lib "user32" (ByVal hWnd As _
        Long, ByVal nIDEvent As Long) As Long


Public TimerEnabled As Boolean
Public Cnt&

Dim hTimer&

Public Sub Init(Interval&)
  hTimer = SetTimer(0, 0, Interval, AddressOf TimerProc)
  TimerEnabled = True
End Sub

Public Sub Terminate()
  Call KillTimer(0, hTimer)
  TimerEnabled = False
End Sub

Private Sub TimerProc(ByVal hWnd&, ByVal Msg&, ByVal idEvent&, ByVal dwTime&)
  Static Flag As Boolean
    
    If Not Flag Then
      Flag = True
      '....
      Cnt = Cnt + 1
      Form1.Label1.Caption = Cnt
      Flag = False
    End If
End Sub
'---------- Ende Modul "Module1" alias Module1.bas ----------
'-------------- 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 4 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 Stephan Hagenguth am 15.11.2010 um 17:26

mal eine Frage, kann man nicht einfach den Timer auf 60 sekunden stellen, dann eine Variable +1 setzen. Wenn dann die gewünschte zeit gefragt ist, z.b. Variabele = 600 also 600 minuten dann springt das entsprechende ereigniss an!
das ist doch weniger umständlich oder?

Kommentar von Daniel Greuter am 03.03.2007 um 14:35

Beim verwenden dieser Funktion schnellt die Kernel-Auslastung sofort auf das Maximum. Gibt es eine Möglichkeit das zu verhindern ? Gruss.

Kommentar von SCHASCH am 27.05.2005 um 11:49

In der Entwicklungsumgebung tritt eine Fehler auf beim Beenden mit der Stop-Schaltflaeche. Der Fehler 91 kann nicht abgefangen werden glaube ich...?
Beim setzen des Intervals auf 100 blinkt die EntUmg...
mfg Sascha

Kommentar von Lothar Hage am 22.02.2004 um 21:49

Habe das unter VBA 6 ausprobiert und hat auf Anhieb funktioniert. Eine gute Möglichkeit unter Excel usw. Daten zu aktualisieren usw.
Danke