Logging in CEdit
-
Hallo Leute,
ich hatte bereits vor einiger Zeit mal etwas über ein kleines Logging-Programm geschrieben.
Erläuterung: ich erhlate auf div. Netzwerkports eingehende Verbindungen. Die Daten werden vom jeweiligen Thread in eine Queue geschrieben und anschließend ein Event gesetzt.
Das Thread, das auf den Event wartet, liest die Daten aus der Queue und schreibt sie in ein CEdit.Ablauf:
→ Event trifft ein
→ alte Daten per GetWindowText( bla ) von CEdit lesen und in CString bla speichern
→ neue Daten aus queue lesen und an CString bla anfügen
→ Text in CEdit per SetWindowText( bla ) schreiben
→ CEdit zur letzten Zeile scrollenJetzt zu meinen Problemen:
1. Ich halte die Idee mit dem Zwischenspeichern in einen CString für problematisch. Was passiert, wenn das Programm mal ein paar Tage läuft und entsprechend viel Speicher verbraucht ist?
2. Ich habe deshalb schon eine maximale Zeilenzahl eingeführt. Wird diese erreicht, dann werden die alten Zeilen verworfen und nur noch die neuen hinzugefügt.
Aus einigen Programmen kenne aber das Verhalten, immer nur eine bestimmte Zahl an Zeilen zu haben, z.B. 100.
Das Verarbeiten scheint einer Queue zu entsprechen: es wird immer am Ende ein neues Element angehängt.
Ist die Queue voll, so wird das erste Element entfernt und ein neues kann wieder hinzugefügt werden.
Aber wie wird dies realisiert? Gibt es nicht einen ziemlichen Overhead, wenn man wirklich eine Queue dafür verwendet und bei der Ausgabe immer Abfragen muss?3. Ich habe noch ein kleines Problem beim Scrolling:
Ab und zu bekomme ich eine Exception, wenn die ersten Daten geschrieben werden sollen.
Ich habe das ganze schon auf das scrolling zurückführen können. Wenn noch nicht genügend Zeilen im Edit sind, dann existiert auch noch kein "Scrollbar".
Im Augenblick versuche ich das durch eine hardcodierte Minimal-zeilen-anzahl zu umgehen.
Ist leider nicht ganz so schön, da erst nach ein paar Zeilen gescrollt wird.
Hat hier vielleicht jemand eine besseren Lösungsvorschlag / Idee? (ich verwende hier leider noch VC6.0)
-
Warum ein Edit wenn du zeilenweise neuen Inhalt bekommst?
Warum kein Listelement?zu 2. Das Prinzip das die erste Zeile verworfen wird wenn eine neue hinzukommt ist das FIFO Prinzip (First-In-First-Out). Für die Fifos gibts einige Implementationen.
Hab das mit dem Listenelement noch nicht ausprobiert, aber dort gibt es bestimmt Möglichkeiten wie man bei Zeilenanzahl X die erste Zeile löschen kann und der Rest automatisch hochrückt. Wenn nicht muss das halt händisch gemacht werden.
-
@McSnoop: vielen Dank.
CEdit, weil man über mehrere Zeilen hinweg Daten markieren und kopieren können soll. Geht das mit Listenelementen ebenfalls?
Das mit den FIFOs war in meiner Queue-Überlegung bereits inbegriffen.
Beim Shiften der Zeilen muss aber doch trotzdem irgendeine kopier-arbeit erledigt werden, oder?Wie wäre es hiermit?: man könnte die Daten vom Edit auslesen und temporär speichern. Dann entfernt man alles inkl. erstem Zeilenumbruch und hängt die neue Zeile an!?
-
Sicher. ListCtrls/Boxen hbane verschiedene Markierungsmodis. Single/Selektion, Extended...
Aber du kannst ReplaceSel verwenden. Damit kannst Du auch Text in eine Listebox hinzufügen. SetWindowText ist in jedem Falle langsamer, als wenn du den Text hinzufügst.
-
@Martin Richter: vielen Dank für die Info, war mir nicht bewusst.
Für mich sahen die Lösungen in den gängigen Log-Tools / Terminals immer wie CEdits aus, aber ich werde das mit der ListBox mal testen.
Kannst Du mir bitte noch sagen, wie es mit der Performance/Speicherverbrauch aussieht?
Ich habe mir schon gedacht, dass SetWindowText langsam ist, aber für CEdit habe ich keine andere Möglichkeit gefunden.
Ein InsertAt oder Add wären ja super, habe ich aber leider (noch) nicht gefunden.
-
Ich habe es doch geschrieben: EM_REPLACESEL/ReplaceSel ist was Du mit Add suchst. Cursor ans Ende Positionieren mit EM_SETSEL/SetSel und dann einfach den neuen Text hinzufügen.