Editfeld als Ausgabefenster
-
Hi,
ein Editfeld wird von verschiedenen Threads als Ausgabefenster genutzt. Hier dürfen die Threads sich natürlich nicht überschneiden. Ok, schnell einen Mutex gebaut und die "print" Funktion thread-safe gemacht. Allerdings hat das Ganze noch ein Problem. So füge ich etwas in das Editfeld ein:
int textlen = GetWindowTextLength(m_textbox); SendMessage(m_textbox, EM_SETSEL, textlen, textlen); SendMessage(m_textbox, EM_REPLACESEL, 1, reinterpret_cast<LPARAM>(msg));
Wenn jetzt zwischen EM_SETSEL und EM_REPLACESEL die Cursorposition verändert wird, führt das natürlich zu sehr unangenehmen Ergebnissen. Ich müsste das Feld also irgendwie "blocken" bevor ich etwas einfüge. Mein Ansatz war:
HWND wnd_focus = GetFocus(); SetFocus(m_wnd); int textlen = GetWindowTextLength(m_textbox); SendMessage(m_textbox, EM_SETSEL, textlen, textlen); SendMessage(m_textbox, EM_REPLACESEL, 1, reinterpret_cast<LPARAM>(msg)); SetFocus(wnd_focus);
So sinkt die Zahl der unerwünschten Ergebnisse zwar, weg sind die aber nicht -.-
Hat jemand hier vielleicht Lösungsvorschläge?
-
Verpacke doch die Aktion "Anhängen" in eine eigene Nachricht (WM_APP+x). Dann empfängt der UI-Thread diese Nachricht, setzt die Position und führt EM_REPLACESEL aus.
Dann benötigst Du nicht mal einen Mutext, denn die Ereignisse werden über die Message-Queue synchronisiert.BTW: Dieses Setfocus ist absolut überflüssig.
-
Super, das sollte funktionieren. Fragt sich warum man da nicht selber drauf gekommen ist. Na ja, besten Dank auf jeden Fall