none
Eine Vielzahl von Ereignissen durch eine Klasse auslösen - DoEvents ? RRS feed

  • 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 ?

     

     

     

    Dienstag, 9. November 2010 09:19

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 Schnittstelle

    Ich 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 unter

        www.gssg.de -> Visual Basic -> VB.net
            -> Multithreading / BackGroundWorker

    ansehen.
    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) Chat

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Dienstag, 9. November 2010 09:49