CEdit und "tail"- Funktion
-
Hallo,
ich habe im Augenblick ein kleines Ideen-Problem:
Ich arbeite an einem Tool, das an einigen Ports lauscht und dort Verbindungen annimmt.
Die Verbindung wird pro Port durch ein Thread "überwacht".
Alle Informationen, die bei einer Verbindung übertragen werden(plain Text) sollen in einer View dargestellt werden.
Die Funktionalität soll dabei wie bei dem UNIX-Befehl tail funktionieren, d.h. die View soll automatisch scrollen.Ich habe das ganze bis her über ein CEdit-Objekt gelöst, d.h.
neue Daten -> alten Inhalt sichern -> neuen Inhalt anhängen -> CEdit Text neu setzen -> ScrollenDas ganze würde auch ganz toll funktionieren, wenn nur ein Thread Nachrichten schreiben will.
Es ist leider immer der Fall, dass nicht nur eine Verbindung besteht, sondern mehrere.
Wenn nun zwei Threads "gleichzeitig" neue Nachrichten schreiben wollen, so werden oft Zeilen ausgelassen.
Das Problem liegt in dem "alte Daten sichern". Da jedes Thread eine temporäre Kopie des alten Inhalts macht und dort die neue Zeile anfügt, kann es bei gleichzeitigem Zugriff zum Überschreiben von neuen Inhalten kommen.Leider steht ich im Augenblick voll auf dem Schlauch und weis nicht, wie ich dieses Problem beseitigen soll.
Ich habe das ganze schon mit einem locking-Mechanismus und Verzögerung versucht.
Das Ergebnis war immer ein "Dead-Lock".Bin für jeden Tipp/Rat mehr als dankbar.
-
Erstens sollte es sowieso nur einen Thread geben, der dein Anzeigefenster steuern darf. Alle anderen Threads können gerne interne Variablen mit Werten füllen und den GUI-Thread darauf hinweisen, daß etwas passiert ist.
Und zweitens solltest du UNBEDINGT verhindern, daß mehrere Threads gleichzeitig die Daten ändern können (dazu brauchst du eine CLock (evt. auch ein CMutex) Variable im Programm, die jeder Thread vor dem Schreiben für sich reserviert und hinterher wieder freigibt).
-
Erstell in deiner Anzeigenklasse Dlg eine Funktion zum Anzeigen des Textes, dann Sendest Du mit SendMessage den Anzuzeigenden Text an den Dialog. Fertig!
BEGIN_MESSAGE_MAP(CXXXDlg, CDialog) //{{AFX_MSG_MAP(CXXXDlg) ... //}}AFX_MSG_MAP ON_MESSAGE(UM_Print, OnPrint) END_MESSAGE_MAP() LRESULT CXXXDlg::OnPrint(WPARAM wParam, LPARAM lParam) { //in lParam sollte der Zeiger auf den Text stehen //Hier dann Printen return 0; } im Thread: CString Text; SendMessage(hWnd,UM_Print,(LPARAM)(LPCTSTR)Text);Du solltest nicht Vergessen UM_Print
in stdafx.h zum Bsp.
#define UM_Print (WM_USER+1)zu definieren, und jedem Thread das Handle auf den Dialog mit zu geben.
Gruß