Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0359: DoEvents nur bei Bedarf zulassen

 von 

Beschreibung 

Mit DoEvents-Befehlen sollte nicht zu verschwenderisch umgegangen werden, da sie das eigene Programm zeitlich stark ausbremsen können. Mit dem hier gezeigten einfachen Funktionsaufruf sollte daher bei zeitkritischen Routinen vorab geprüft werden, ob überhaupt Events anliegen, die der Freigabe bedürfen. Nur in diesem Falle sollte dann ein DoEvents ausgeführt werden.

Update von Florian Rittmeier am 23. September 2004 nach einem Hinweis von Jost Schwider:
Nun wird das DoEvents wirklich nur noch alle 100 Durchgänge ausgeführt.

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Verwendete API-Aufrufe:

GetInputState

Download:

Download des Beispielprojektes [2,65 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 "Command3"
' Steuerelement: Schaltfläche "Command2"
' Steuerelement: Schaltfläche "Command1"

Option Explicit

Private Declare Function GetInputState Lib "user32" () As Long

Private Break As Boolean

Private Sub Command1_Click()
    Dim x As Long
    
    'Methode 1
    Break = False
    Call EnableButtons(False, False, True)
    
    Do
        'DoEvents nur bei Bedarf zulassen
        If GetInputState() Then DoEvents
        x = x + 1
        Me.Caption = x
    Loop While Not Break
    
    Call EnableButtons(True, True, False)
End Sub

Private Sub Command2_Click()
    Dim x As Long
    
    'Methode 2
    Break = False
    Call EnableButtons(False, False, True)
    
    Do
        'DoEvents alle 100 Durchläufe freigeben
        If x Mod 100 = 0 Then DoEvents
        x = x + 1
        Me.Caption = x
    Loop While Not Break
    
    Call EnableButtons(True, True, False)
End Sub

Private Sub Command3_Click()
    Break = True
End Sub

Private Sub EnableButtons(s1 As Boolean, s2 As Boolean, s3 As Boolean)
    Command1.Enabled = s1
    Command2.Enabled = s2
    Command3.Enabled = s3
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- 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 3 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 Philipp Stephani am 17.10.2005 um 17:11

Eine Verbesserung wäre die Verwendung von GetQueueStatus statt GetInputState, damit kann man wahlweise alle oder nur bestimmte Nachrichten, auch Zeitgeber, erkennen.

Kommentar von Joachim Zaich am 25.03.2004 um 16:40

Die Anweisung GetInputState() prüft nur Eingaben. Andere Teile, wie Timer werden weiterhin ausgebremst wenn ein Programm zu sehr mit sich selbst beschäftig ist. Ich mußte bei meinen Sortieraufgaben (über 120.000 Namen) wieder alle x Schritte einen doevents einbauen um die Anzeigen wie Fortschrittsbalken zu sehen, (Timergesteuert alle 1/2 Sekunde).

Kommentar von Daniel Pramel am 25.02.2002 um 07:49

Lange nichtmehr so einfachen und nützlichen Code gesehen. Danke!!