Hallo,
nach einigen Jahren Erfahrung mit VB6 musste ich jetzt folgendes Problem feststellen: beim Empfang von seriellen Zeichen wird das Event MSComm1_OnComm aufgerufen. Werden bestimmte Daten empfangen, dann wird eine Email gesendet. Da dies etwas dauert, werden hierbei DoEvents ausgeführt. Hierbei passiert es, dass MSComm1_OnComm erneut aufgerufen wird, obwohl der 1. Aufruf noch nicht beendet ist. Ich war (bisher) der Meinung, dass ein Event immer erst abgearbeitet wird, bevor ein neues aufgerufen wird.
Dieses Problem konnte ich durch Verwendung einer statischen Lock-Variable lösen, aber ich möchte das Ganze verstehen.
Also: Wer weiss was genaueres zu diesem Thema bzw. wo kann man was nachlesen.
Gruß, Werner
Hallo Werner,
Also: Wer weiss was genaueres zu diesem Thema bzw. wo kann man
was nachlesen.
mit einem DoEvents rufst Du den Eventhandler auf, der dann prüft ob Events vorliegen, arbeitet die ab und gibt den Programmpointer erst danach zurück. Deine Kommunikation löst auch Events aus, die dann verarbeitet werden. Wenn zwischendurch keine Klickereignisse abgearbeitet werden sollen, musst Du die entweder verhindern, indem Du die Button oder die Form deaktivierst, oder die Form subclassen und die Klickereignisse abfangen. Deaktivieren ist wohl einfacher und sinnvoller.
Wo man das nachlesen kann weiß ich nicht.
Gruß, Rainer
Die Kernfrage ist, ob solange ein Eventhandler abgearbeitet wird, er für weitere Aufrufe gesperrt ist.
Macht man einen Test mit einem Timer der ein Intervall von 100ms hat, und beim Aufruf 1000ms wartet (mit DoEvents), dann wird der Timer alle 1000ms aufgerufen, und nicht alle 100ms!!
Bei meinem Problem mit dem Kommunikations-Event scheint dies anders gehandelt zu werden.
Gruß, Werner
Hallo Werner,
Die Kernfrage ist, ob solange ein Eventhandler abgearbeitet
wird, er für weitere Aufrufe gesperrt ist.
Nein, ist er nicht.
Macht man einen Test mit einem Timer der ein Intervall von
100ms hat, und beim Aufruf 1000ms wartet (mit DoEvents), dann
wird der Timer alle 1000ms aufgerufen, und nicht alle 100ms!!
Das ist eine Eigenheit des Timers, der verhindert, daß die Prozedur doppelt läuft. Das ist nicht der Eventhandler.
Bei meinem Problem mit dem Kommunikations-Event scheint dies
anders gehandelt zu werden.
probier mal den Code:
Option Explicit
Private Sub Command1\_Click()
shw
End Sub
Private Sub shw()
Dim t As Long
Me.Caption = Time
t = Timer + 10
While Timer
Wenn Du nur einmal klickst, kommt nach zehn Sekunden die Meldung: Zeit um. Klickst Du im Sekundentakt, wird 't' jedes mal neu gesetzt, überschrieben. Erst 10 Sekunden nach dem letzten Klick gehen die Aufrufe nacheinander zu Ende.
Wenn Du mehrfach klickst und dann 'Pause' drückst, kannst Du im Debugger sehen, daß die Warteschleife tatsächlich mehrfach läuft.
Gruß, Rainer
Hallo Rainer,
danke für die aufschlussreiche Antwort. Interessant am Beispiel ist auch, dass die Funktion zwar mehrfach aufgerufen werden kann, aber nicht wirklich reentrant fähig ist, da die Variable t nur einmal angelegt wird.
In VB6 gibts wohl keine auto-Variablen, wie in C oder ??
Gruß, Werner
Hallo Werner,
danke für die aufschlussreiche Antwort. Interessant am
Beispiel ist auch, dass die Funktion zwar mehrfach aufgerufen
werden kann, aber nicht wirklich reentrant fähig ist, da die
Variable t nur einmal angelegt wird.
ja, das ist eben nur eine Prozedur. In dem Fall stört es nicht, andere Prozeduren erzeugen unter Umständen ziemlichen Unfug, wenn sie neu gestartet werden, bevor sie fertig sind.
In VB6 gibts wohl keine auto-Variablen, wie in C oder ??
Ich kann C nicht. Geht es um eine Variable, die mehrfach verwendet werden kann und verschiedene Werte gleichzeitig annehmen kann? Stichwort objektorientierte Programmiereung? Doch, das geht in VB auch, mit mehreren Instanzen einer Klasse, es gibt in VB dazu unter anderem Klassenmodule. Steuerelemente sind auch Klassen und die Collection auch.
Gruß, Rainer
ja, das ist eben nur eine Prozedur. In dem Fall stört es
nicht, andere Prozeduren erzeugen unter Umständen ziemlichen
Unfug, wenn sie neu gestartet werden, bevor sie fertig sind.
Wie in meiner Comm-Routine.
Ich kann C nicht. Geht es um eine Variable, die mehrfach
verwendet werden kann und verschiedene Werte gleichzeitig
annehmen kann? Stichwort objektorientierte Programmiereung?
Ja genau.
Also nochmals Danke und bis zum nächsten Mal.
Werner