Benutzer mit den meisten Antworten
Eine Vielzahl von Ereignissen durch eine Klasse auslösen - DoEvents ?

Frage
-
Ich habe eine grundsätzliche Frage:
Meine selbstgeschriebene Klasse empfängt per Event Daten von der seriellen Schnittstelle, bearbeitet diese und soll dann wiederum selbst in Abhängigkeit vom Inhalt der emfangenen Daten Ereignisse auslösen.
Meist bedeutet dies, dass empfangene Daten EIN neues Ereignis auslösen, es kann aber auch schon mal sein, dass dann 16 Ereignisse ausgelöst werden sollen.
Das sähe etwa wie folgt aus:
for i=0 to 15 RaiseEvent MyEvent(i) next
16 Eeignisse sind hjetzt sicherlich nicht die Welt, aber ...
blockiere ich mir damit die Anwendung / Klasse?
Nächste Frage im gleichen Kontext:
Der Aufruf Einer Methode der Klasse löst aus, dass 64 Befehle á 16 Byte über die serielle Schnittstelle verschickt werden. Das gerät am anderen Ende des Kabels beantwortet diese Befehle mit zahlreichen Datenpaketen.
Das sähe etwa wie folgt aus:
Sub FordereDatenAn() for i=0 to 63 SendBefehl(i) next End Sub
Auch hier wieder die Frage:
Blockiere ich während des Aussendens der 64 Befehle die Anwendung / Klasse und ...
Kann ich noch auf die dann einegehenden Antworten reagieren ?
Die letztere Frage würde ich mal als relativ unprobelamtisch ansehen - dank Handshake und ordentlicher Puffer an der seriellen Schnittstelle
In der Anwendung hätte ich sofort noch überall DoEvents eingefügt, aber geht das in einer Klasse ?
Antworten
-
Hallo,
Meine selbstgeschriebene Klasse empfängt per Event Daten von
der seriellen Schnittstelle,Ein Ereignis des SerialPort-Objektes?
Welches Ereignis konkret?bearbeitet diese und soll dann wiederum selbst in Abhängigkeit
vom Inhalt der emfangenen Daten Ereignisse auslösen.
Meist bedeutet dies, dass empfangene Daten EIN neues Ereignis
auslösen, es kann aber auch schon mal sein, dass dann 16
Ereignisse ausgelöst werden sollen.
Das sähe etwa wie folgt aus:
for i=0 to 15
RaiseEvent MyEvent(i)
next
16 Eeignisse sind hjetzt sicherlich nicht die Welt,... bedeuten erst mal gar nichts.
aber ...
blockiere ich mir damit die Anwendung / Klasse?Das kommt darauf an, was der Empfänger dieser Events
damit macht, sprich welchen und wieviel Code er daraufhin
ausführt und natürlich nicht zuletzt darauf ob er das im selben
Thread tut oder asynchron in einem separaten Thread erledigt
um so Blockaden zu verhindern.Nächste Frage im gleichen Kontext:
Der Aufruf Einer Methode der Klasse löst aus, dass 64 Befehle
á 16 Byte über die serielle Schnittstelle verschickt werden.
Das gerät am anderen Ende des Kabels beantwortet diese
Befehle mit zahlreichen Datenpaketen.
Das sähe etwa wie folgt aus:
Sub FordereDatenAn()
for i=0 to 63
SendBefehl(i)
next
End Sub
Auch hier wieder die Frage:
Blockiere ich während des Aussendens der 64 Befehle die
Anwendung / Klasse und ...Wenn das Aussenden im selben Thread, also synchron erfolgt,
dann blockiert das diesen Thread. Wird asynchron in einem
separaten Thread gesendet dann gibt es keine Blockade,
das Ende des Sendens müsste dann z.B. wieder durch ein
Ereignis signalisiert und erkannt werden.Kann ich noch auf die dann einegehenden Antworten reagieren ?
Auch hier gibt es keine eindeutige Antwort, solange nicht
geklärt ist, ob Du Deine Sende- und Lesevorgänge synchron
oder asynchron ausührst.Die letztere Frage würde ich mal als relativ unprobelamtisch ansehen
- dank Handshake und ordentlicher Puffer an der seriellen SchnittstelleIch befürchte, Du siehst die Sache ein bisschen zu einfach.
Wenn Du Code im Ereignis SerialPort_DataReceived und auch
direkt von dort aufgerufenen Code ausführst, so wird dieser
in einem separaten Thread, also nicht in Deinem Hauptthread,
ausgeführt. Zugriffe dieses Codes auf Objekte (Forms, Controls usw.)
die in Deinem Hauptthread erstellt worden sind, werden ohne
weitere Vorkehrungen als Fehler (unerlaubter threadübergreifender
Zugriff) erkannt und lösen somit eine Exception aus.
Solche Zugriffe musst Du also erst mal threadsicher machen. Wie
das geht kannst Du Dir in den Beispielen unterwww.gssg.de -> Visual Basic -> VB.net
-> Multithreading / BackGroundWorkeransehen.
Da in vielen Fällen die serielle Schnittstelle das langsamste
Objekt in einem sonstigen Projekt ist, empfiehlt es sich meist,
Lese- u. evtl. auch Sendevorgänge asynchron in einem separaten
Thread auszuführen und somit das Blockieren des Hauptthreads
(u.a. der Benutzeroberfläche) zu blockieren.
In der Anwendung hätte ich sofort noch überall DoEvents eingefügt,
aber geht das in einer Klasse ?Nein, lass die Finger von "DoEvents".
Damit gibst Du die Kontrolle über Deine Programmabläufe an
Windows ab und verlierst die Kontrolle darüber, wann was
wirklich abgearbeitet wird.Ein Beispiel mit dem SerialPort-Objekt findest Du unter
www.gssg.de -> Visual Basic -> VB.net
-> Sonstige
-> Serial Port (RS232) ChatGruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)- Als Antwort markiert Robert BreitenhoferModerator Freitag, 3. Dezember 2010 14:52