www.mikrocontroller.net

Forum: PC-Programmierung besonders schnelles Richedit-Control


Autor: H. D. (c3po)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

für eine Logging-Anwendung suche ich eine Möglichkeit Text sehr schnell 
ausgeben zu können, ich habe ähnliches vor längerem mit VC 6.0 gemacht, 
damals hat es noch gereicht, aber jetzt sind die Anforderungen an die 
Textausgabegeschwindigkeit gestiegen.

Wer kann mir da etwas empfehlen?

Achja, nach Möglichkeit sollte das ganze auf einem 1-Core System so 
funktionieren, dass Empfang, Auswertung und Ausgabe gleichzeitig machbar 
sind ohne dass das System stehen bleibt und ohne dass die Anzeige noch 
stundenlang nachscrollt nachdem nichts mehr empfangen wird. Die Ausgabe 
sollte in Farbe möglich sein.

ich sage schon einmal Danke

Gruß
H.D.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen Sinn hat die besonders schnelle Ausgabe von Text? Das kann doch 
eh' keiner mehr lesen. Auch verbrät sowas sämtliche zur Verfügung 
stehende Rechenleistung.

Sinnvoller wäre die Darstellung des jeweils letzten Pufferinhaltes, wenn 
zeilenorientierter Text darzustellen ist, wäre ein ListView, genauer ein 
virtueller ListView wesentlich sinnvoller. Und wenn Du daraus einen 
OwnerDraw-ListView baust, kannst Du auch Text mit verschiedenen 
Attributen wie Farbe etc. ausgeben.

Was ist die Anwendung, wozu soll das ganze gut sein?

Autor: H. D. (c3po)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie ich bereits sagte soll es ein Datenlogger werden, der mehrere 
Eingangsstreams hat diese etwas aufbereitet und dann ausgibt.

virtuelles Listview könnte man nehmen, die frage ist nur ob es schnell 
genug ist für meinen Zweck.

Danke für den Tipp

Fällt sonst noch jemandem etwas ein wie ich es umsetzen könnte oder was 
ich benutzen kann ?

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Logger wird bei der direkten Ausgabe aber immer hinterher hinken, 
weil er primär eine andere Aufgabe hat - nämlich loggen, nicht ausgeben.

Ralf

Autor: H. D. (c3po)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wohl wahr, allerdings wenn du zum Zeitpunkt 0 alle Eingänge abziehst und 
du siehst dass die Ausgabe noch eine Minute mit ausgeben beschäftigt 
ist, dann ist das auch nicht sinn und zweck der Sache
nachlaufen ok aber der Nachlauf sollte konstant sein und nicht abhängig 
sein von der Länge der Loggingzeit.

Nachtrag: seine primäre Aufgabe sind nicht nur das loggen sondern das 
zeitgleiche Ausgeben der bearbeiteten Log-Daten in Echtzeit.
zumind. so meine Forderung ;-)

Natürlich darf es nicht so umgesetzt sein, dass der Logger warten muss 
bis die bearbeiteten Daten ausgegeben wurden ...

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das schnelle zeitgleiche Ausgeben in Echtzeit ist unnötig.
Sollten wirklich alle Daten wenigstens einmal auf dem Bildschirm zu 
sehen sein, begrenzt bereits die Bildwiederholfrequenz die 
Datenerfassungsrate.

Angenommen, das Logfenster kann 40 Einträge lesbar darstellen (Parameter 
hier: Schriftgröße und Bildschirmauflösung), und das ganze wird auf 
einem üblichen TFT-Monitor ausgegeben, dann können nicht mehr als 1200 
Einträge pro Sekunde erfasst werden.

Das ist sinnlos, außerdem kann das kein Mensch mehr lesen.

Es genügt also, den Bildschirminhalt asynchron zum eigentlichen 
Logvorgang zu aktualisieren, und zwar nicht so, daß jeder empfangener 
Datensatz ausgegeben wird, sondern so, daß bei jeder 
Bildschirmaktualisierung die letzten 40 (oder wieviele auch immer 
sichtbar sind) ausgegeben werden.

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich frage mich, wovon man ausgehen soll:

a) Alle protokollierten Daten werden ausgegeben.

b) Es werden (nur) soviele Daten ausgegeben, dass die 
"Scrollgeschwindigkeit" einen bestimmten Wert nicht überschreitet.
Der Wert richtet sich danach, was das menschliche Auge noch erkennen 
kann.

Mein Vorschlag:

Das Steuerelement hat eine bestimmte Anzahl Zeilen (z.B. 80 Zeilen).
Die Logdaten laufen durch einen Ringpuffer, der 80 Einträge hat.
Ein Timer schreibt periodisch den Ringpuffer in das Steuerelement.

=> Wenn die Daten relativ langsam reinkommen, entsteht tatsächlich ein 
Scrolleffekt, wie gehabt.
=> Wenn die Daten zu schnell reinkommen rutschen zwischen zwei 
Aktualisierungen Daten durch den Puffer, was aber egal ist, man kann sie 
sowieso nicht lesen (erkennen).
=> Wenn keine Daten mehr kommen, werden auch keine Daten mehr durch den 
Puffer geschoben, sondern die letzten 80 bleiben dort stehen und werden 
immer wieder in's Steuerelement geschrieben (evtl. double-buffer 
verwenden, wegen dem flimmern, das sonst entsteht)

Sollen im nachhinein Daten angezeigt werden, die nicht im Steuerelement 
stehen, kann man sie über eine (Such-)Maske abrufen.

Kannst Du mal ein Mengengerüst nennen: Wieviele Zeilen/s bzw. MB/s 
sollen denn verarbeitet werden?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So als Vorschlag, aufwendig aber wohl das schnellste:

- Einen Ring- (oder sonstwas) Puffer der die Daten aufnimmt (am besten 
Binär, da kompakter).

- Ein Ausgabefenster welches die Binärdaten interpretiert anzeigen kann.

- Ein dazu passender Scrollbalken um die Anfangszeile zu verschieben

siehe dazu DrawText(...) in der MSDN.

Gruss
Peter

Autor: H. D. (c3po)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Hans:
ausgehen kannst du von a) alle protokollierten Daten + zusätzliche Infos 
die direkt ausgewertet werden.

Ich sehe schon am besten mache ich es so
Das was auf dem Bildschirm erscheinen soll wird in einer Datei 
ausgegeben statt auf dem Screen
Der Screen aktualisiert sich zyklisch und holt sich die letzten x Zeilen 
aus der Datei
wenn man sich dann die Daten (die eigentlich auf dem Screen angezeigt 
werden sollten) ansehen will holt man sich den entsprechenden Ausschnitt 
aus der Datei heraus

==> schreiben eines entsprechenden Anzeige-Controls
+ Scrollbars

das dumme dabei ist nur dass ich dann nicht einfach hergehen kann und 
wie im Richedit machbar einen bereich markieren, kopieren um ihn dann 
woanders einzufügen, zumind. nicht ohne längere umsetzungszeit

bzgl.: der Menge, theoretisch was der Rechner hergibt
Damals waren es etwa max 8 * 115kBit sprich etwa 1MB
aber das Programm hat da keine Restriktion bzgl. der Anzahl der Kanäle
So viele RS232 wie angeschlossen werden können und das Programm öffnet 
soviel wird eben geloggt und gleichzeitig angezeigt...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.