VB 5/6-Tipp 0359: DoEvents nur bei Bedarf zulassen
von ActiveVB
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: | Verwendete API-Aufrufe: | Download: |
'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-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
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!!