Wenn ich die hier auskommentierte Messagebox in den Ablauf hinein nehme, wird auf jedes Ereignis reagiert, also ich bekomme eine Ausgabe bei jedem mal wenn ich etwas schicke. Es reagiert wie erwartet. Alles ist gut, nehme ich nun die Messagebox heraus, so reagiert die Anwendung auf das erste Senden, und danach "beliebig". Beliebig heißt das mal nach jedem den 10. Senden, mal auf 2 aufeinander folgenden Sendungen.
Kann das mit Threading zu tun haben, oder ist es nur ein "Bug"?
Hat jemand eine Idee?
leider sind unerklärlichen Verhalten unerklärlich. Wenn es sich also hier wirklich um ein unerklärlichen Verhalten handeln würde, dann dürftest du nicht auf eine Antwort hoffen. :-)
Klar ist, dass MessageBoxen den Ablauf der Anwendung - teilweise gravierend und unerwartet - ändern.
Zitat
Beliebig heißt das mal nach jedem den 10. Senden, mal auf 2 aufeinander folgenden Sendungen.
Kannst du das bitte genauer erklären. Meinst du damit, dass du DataReceived nur einmal für zwei Datenpakete bekommst? Oder was anderes?
Habe die Anwendung auf einem Controlpanel, welchem ich zu Testzwecken über ein Programm auf dem PC via Comport telegramme zuschicke.
D.h. wenn ich von meinem PC das erste Telegramm schicke wird in jedem Fall richtig reagiert.
Habe ich die MessageBox im Code drin, wird auf jedes Protokol das ich sende erst mit der MessageBox und danach entsprechend der darauf folgenden Rutine reagiert.
Nehme ich die MessageBox heraus, so wird immer noch auf das erste Telegramm reagiert, (auch richtig) jedoch nicht unbedingt auf das darauf folgenden.
Also drücke ich in meinem Programm zum Senden wiederholt auf den Senden Button. Das Programm auf dem ControlPanel, also das welches diese Telegramme auswerten soll, reagiert dann nur noch manchmal. Dabei ist es egal, ob ich einige Sekunden Pause mache oder sehr schnell klicke.
Mal reagiert das Programm auf zwei aufeinander folgende Protokolle, mal macht es 10 oder 20 mal Senden gar nichts.
Ablauf:
Senden Reaktion
Protokoll Ja
Protokoll Nein
Protokoll Nein
Protokoll Nein
Protokoll Ja
Protokoll Ja
Protokoll Nein
...
Ich hoffe das ich so das Phänomen erschöpfend beschrieben habe.
Danke sehr, das wars Tatsächlich. Löscht ReadExisting den Speicher selber? Also hab ich das dann doppelt gemacht?
Probiere gerade was passiert wenn sehr viele Daten kommen. Aber bis jetzt scheint es keinen überlauf oder so etwas zu geben.
Habe mal mit sehr viele Daten geschickt. Mein Code ist Offensichtlich nicht sehr perfomant, Habe aber dadurch feststellen können, Das der Code, je länger er arbeitet immer langsamer wird. Am Anfang wurden etwa 5-7 Auswertungen pro Sekunde durchgeführt, zum Schluss waren es nur noch 2 Auswertungen je Sekunde. Das spricht doch dafür, das sich ein "großer Berg" Daten angesammelt hat, den ich ja nun nicht mehr lösche(glaub ich). Die Hilfe konnte mir zu der Frage ob ich den Einlesespeicher lösche (mit readexisting) nicht weiter Helfen.
Ander zwischen Frage, ich gebe in eine Textbox mit Multiline und Scrollbar aus, ist da die Max Zeilenanzahl vorgegeben? Denn ich kann nur bis zu einer gewissen Stelle herunter scrollen, danach andert sich der inhalt nicht mehr, Obwohl er ja zumindest eine Andere Zeit anzeigen muss. Es sind bis dahin aber bestimmt einige hundert Zeilen.
Habe mal nachgeguckt. Ein string, zumindest war das bei C++ beim Ansi string so, hat 4GB kapazität, ich kan darstellen, also das was ich scrollen kann sind 951 Zeilen mit jeweils 63 Zeichen. Das sind aber wenn ein zeichen ein Byte hat nur ca 60kb, das ist ein bischen wenig finde ich, evtl. Zeilen Beschränkung?
Löscht ReadExisting den Speicher selber? Also hab ich das dann doppelt gemacht?
Um Speicher und "Überläufe" mache dir mal keine Gedanken. Das Problem dürfte sein, dass du z.B. mit ReadExisting() z.B. 8 Bytes liest. Dann kommen z.B. nochmal 2 neue Bytes rein und bevor du die wieder abholst, hast du sie schon mit DiscardInBuffer() rausgeworfen. Du verlierst also Zeichen.
DiscardInBuffer() verwendet man eigentlich eher im Kontext des synchronen Modells (also ohne DataReceivedEvent) um sauber "aufzusetzen".
Habe gerade 11.000 durchläufe gemacht, läuft mit ersetzen ohne Probleme und sehr schnell, ist jedoch nicht sinnvoll. gibt es eine effektive variante, also ohne ebiges schrittweise durchgehen, den TextBox Inhalt auf 500 Zeilen oder so zu begrenzen, Sowas könnte ich machen.
Aber ersetzen würde den ganzen Sinn zunichte machen, ich will ja zustände mitschreiben, die auch mal sehr schnell reinkommen können, wäre doof wenn man dann irgendwas wichtiges nicht sehen könnte.