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?


  • Mod

    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 😃


Log in to reply