Textdatei in einer Textbox anzeigen.
-
txt schrieb:
hallo,
ein thread schreibt zeilen in eine textdatei. diese datei soll in einer textbox angezeigt werden. wenn also eine neue zeile zur datei hinzukommt, soll das auch in der textbox sichtbar sein.wie mache ich sowas am besten?
Die FileSystemEventArgs-Klasse stellt für derlei Aufgaben die FileSystemWatcher-Komponente zur Verfügung, mit der Dateiänderungen (Erstellen, Löschen, Umbenennen, Änderungen) überwacht werden können. Ausführliche Beispiele findest du in der Klassen-Beschreibung.
-
@txt: Schreib doch in dem Thread in dem du die Txt-Datei schreibst gleichzeitig die Listbox, oder versteh ich was falsch?
-
Firefighter schrieb:
@txt: Schreib doch in dem Thread in dem du die Txt-Datei schreibst gleichzeitig die Listbox, oder versteh ich was falsch?
ja, die idee kam mir auch später dann. besser ist es, wenn der thread selbst die box erzeugt und die daten schreibt. dann spare ich mir dies invoke zeugs.
-
Ein Nebenthread darf aber niemals GUI-Element erzeugen bzw. direkt darauf zugreifen (da die WinAPI nur single-threaded ist!).
s.a. [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke) http://www.mycsharp.de/wbb2/thread.php?threadid=33113
-
son mist, das es so kompliziert sein muss
will eigentlich nur popelige strings in die box schreiben
-
Mal ne andere Frage, wozu den extra Thread? Ist das schreiben der strings in die Datei so extrem aufwändig das man das im Hintergrund machen lassen muss?Weil wenn nicht solltest du drüber nachdenken alles im GUI Thread zu machen, solange es möglich ist.
-
das geht leider nicht, die threads müssen sein. auf anfrage des benutzers durch klicken sollen die threads ihre daten in textboxen anzeigen.
dann kommt immer son
müll wieauf das verworfene objekt kann nicht zugegriffen werden
wenn man das fenster schliesst
-
Klingt als hatte er ein längeren Prozess in einem Thread und erzeugt dort ein Log Output und will diesen auch live in der UI anzeigen.
Die korrekt Lösung dafür ist das der Thread eine Message mit entsprechenden Objekt schickt, das kann auch generischer sein.
Man braucht dann nur eine Schnittstelle wo es aus dem WorkerThread in den UIThread geschoben wird.
Wenn du den BackgroundWorker verwendest hast du das bereits fertig in dem OnProgressChanged event, aber auch ein manuelles Invoke wird dich nicht umbringen.
Durch dieses "Messaging" kann dann dein Thread die UI informieren, nicht nur Log Output sondern auch Progress etc.Sowas macht man recht oft, wenn man ein "PleaseWait" Fenster hat und dort auch den Progress, Cancel und die aktuelle Message anzeigen will, da muss es eine Schnittstelle in beide Richtungen geben.
-
ich habs mit invoke gemacht und stimmt, ich lebe noch *g*
trotzdem kommt beim schließen der aufgerufenen form mit der textbox
auf das verworfene objekt kann nicht zugegriffen werden
gut, ich könnte das mit try/catch abfangen, aber das ist mir iwie unsauber.
-
Na du musst schon überprüfen ob die Form noch steht oder nicht - bedenke das der GC erst korrekt aufräumen kann wenn keine verweise mehr existieren.
Aber wie gesagt, bevor du blank die TextBox ansprichst und dort text rein packst, überprüfe es vorher.