Forum: PC-Programmierung Anzeigen von Daten bei einer Protokollierung


von Klatec (Gast)


Lesenswert?

Hallo Zusammen

Ich habe wieder eine Problem mit meiner Protokollierung von seriellen 
Daten (Telegramme).
Ich empfange über eine serielle Schnittstelle Telegramme und speichere 
die Byte's in einen Ringpuffer und werte diesen zwischen dem Empfang aus 
und schreibe dann einen Langtext in eine richtTextbox um in dann 
anzusehen.


txtProt.Text = txtProt.Text + "Tel.: " + (intRowCount) + "Text je 
Telegramm";

Das Problem ist die Geschwindigkeit, wenn ich nur die Auswertung mache 
und nicht den Langtext in die TextBox schreibe geht das flott aber mit 
der Ausgabe ist das nicht brauchbar weil der Puffer (50000 Byte) rasch 
voll ist. Hat jemand eine Idee wie ich die Ausgabe machen könnte. bitte. 
Danke.

Lg.

Johann K.

von Wurfbrot (Gast)


Lesenswert?

C#? Vielleicht mal mit StringBuilder und txtProt.AppendText(...) 
probieren.

Ist es denn sinnvoll, bei jedem Update einen ellenlangen (Gesamt-)Text 
reinzustopfen? Kann man da überhaupt sinnvoll mitlesen?

Und: Kannst du nicht ListBox/ListView o.ä. verwenden und dort einfach 
jeweils eine Zeile anhängen? Das dürfte ja schneller sein als immer den 
ganzen Text zu verarbeiten und reinzuschieben.

Denk daran, dass Strings in C# immutable sind, da wird bei 
Textoperationen immer allokiert und kopiert (ok, beim Aneinanderhängen 
ist das ja eh klar). Da kommen also jeweils ein paar Bytes rein und du 
hantiert evtl. irgendwann jedes Mal mit einem riesigen Text. Ist ja 
logisch, dass es dabei früher oder später Probleme gibt.

von Klatec (Gast)


Lesenswert?

Hallo Wurfbrot

Der Name hat der etwas mit dem Tauben füttern zu tun, mit Brot 
hinwerfen, ist gut.
Danke für deine Antwort ich werde mich etwas spielen.

Lg.
Johann K.

von Sheeva P. (sheevaplug)


Lesenswert?

Klatec schrieb:
> Ich habe wieder eine Problem mit meiner Protokollierung von seriellen
> Daten (Telegramme).
> Ich empfange über eine serielle Schnittstelle Telegramme und speichere
> die Byte's in einen Ringpuffer und werte diesen zwischen dem Empfang aus
> und schreibe dann einen Langtext in eine richtTextbox um in dann
> anzusehen.
>
> txtProt.Text = txtProt.Text + "Tel.: " + (intRowCount) + "Text je
> Telegramm";
>
> Das Problem ist die Geschwindigkeit, wenn ich nur die Auswertung mache
> und nicht den Langtext in die TextBox schreibe geht das flott aber mit
> der Ausgabe ist das nicht brauchbar weil der Puffer (50000 Byte) rasch
> voll ist. Hat jemand eine Idee wie ich die Ausgabe machen könnte. bitte.
> Danke.

Vielleicht ist Multithreading eine Lösung für Dich: ein Thread nimmt die 
seriellen Daten entgegen und schreibt sie in den Ringpuffer, ein zweiter 
liest die Daten aus dem Ringpuffer und gibt sie aus.

von Thomas R. (dt_roll)


Lesenswert?

> txtProt.Text = txtProt.Text + "Tel.: " + (intRowCount) + "Text je
Telegramm";


Bei so einem Konstrukt sollte man sich genauer den effektiven Vorgang 
anschauen. Ich hatte das auch mal. Dabei wurde eine neue Variable um N 
Bytes groesser auf dem Heap angelegt, dann alles bisherige kopiert, das 
neue angehaengt, und dann der Pointer drauf gewechselt. Im Sinne von wie 
kriege ich 3GHz in die Knie.
Ich hab dann statisch ein grosszuegiges array aus charactern angelegt, 
zB 50MByte, drauf geschrieben, gefuellt, ein neues angelegt, das alte 
auf die disk, oder auch nicht. Das war beliebig viel schneller.
Die Aufgabe war das Laden von Textdaten. Im Sinne von aus 15 Minuten 
mach 10 Sekunden.

von Wolfgang (Gast)


Lesenswert?

Klatec schrieb:
> txtProt.Text = txtProt.Text + "Tel.: " + (intRowCount) + "Text je
> Telegramm";

Wozu wurden eigentlich Tabellen mit Spaltenüberschriften erfunden. Den 
ganzen redundanten Text musst du beim Lesen jedesmal mit durch deine 
Verarbeitung im Hirn schieben. Meinst du, dass das das Lesen ernsthaft 
erleichtert?

Aber wenn es denn unbedingt sein muss: Hat deine Rich-Text-Box keine 
effiziente Append Methode?

von Klatec (Gast)


Lesenswert?

Hallo Zusammen

Ich habe die Idee vom Kollegen Wurfbrot aufgenommen und statt der 
TextBox eine ListBox verwendet und es funktioniert wunderbar. Ich möchte 
nicht gewaltig viel Zeit investieren weil das Programm nur ein Behelf 
für den Bau einer Baugruppe (XpressNet Ankopplung, Modellbahn, Firma 
Lenz) ist und dann nicht mehr benötigt wird. Ich bedanke mich für die 
Anregungen. Super.
Lg.

Johann K.

von Hans (Gast)


Lesenswert?

Hallo, ich empfehle Dir eine Gridview, dann ist Zeilenbasieren, 
Zeitstempel, Kommandos, etc. haben Ihre eigene Spalte. Die Gridview 
lässt sich sehr einfach anpassen für deine optischen Anforderungen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.