Probleme mit PostThreadMessage(...) und Popups bzw. modalen Fenstern



  • Auf Grund der regen Nachfrage nochmal auf Deutsch 🙂 (ich hatte vergessen, dass das Forum hier www.c-plusplus.DE/forum heisst)

    Ich benutze den C-Builder 6 und habe eine Anwendung mit mehreren Threads. Jetzt möchte ich auf ein Ereignis in einem Thread eine VCL-Komponente (selbst gemacht) verändern und neu zeichnen. Da man dies aber nur aus dem Hauptthread darf, habe ich versucht mit der Win-API-Funktion PostThreadMessage(ThreadId, Message, WParam, LParam) eine Message zu verschicken und diese dann im Hauptformular im OnMessage-Callback zu empfangen.
    Soweit - so gut - das klappt auch alles wunderbar. Wenn ich aber jetzt hingehe und das Popup-Menu vom Hauptfenster öffne, kommen keine Nachrichten mehr in OnMessage an. Die werden dann (weil sie ja keiner behandeln kann) einfach so vom Standard-Handler gefressen nehm ich an. Das ganze funktioniert auch (nicht), wenn man zum Beispiel einen Dialog (Speichern oder sowas) modal aufmacht.

    Wer weiss Rat 😕

    basedow



  • Kommuniziert der Thread mit einem Form oder der TApplication?
    Verwendest Du Synchronize() und/oder TCriticalSection?

    Etliche Komponenten der VCL sind nicht Threadsicher. Daher kommen wohl auch Deine Probleme...

    Schau mal unter Anwendungsentwicklung mit dem C++Builder / Der VCL/CLX-Haupt-Thread.



  • Nee,

    ich schick doch mit PostThreadMessage(ThreadId, ...) ne Windows-Nachricht an den Thread mit der Id ThreadId. Wenn ich da die Id vom Haupt-Thread angebe, wird die Nachricht in die Queue vom Hauptthread gesteckt. Und die Nachrichten werden doch immer in dem Thread bearbeitet, dem die Queue gehört oder? Steht zumindest so in der Hilfe.
    Das mit den VCL-Komponenten weiss ich - deswegen mach ich ja den ganzen Aufwand. Anderen Stellen benutzte ich auch CriticalSections zum Synchronisieren.
    Für dieses Problem reicht das aber nicht, weil sonst nicht der Haupt-Thread das neu zeichnen machen würde. Und das wär nix, wegen s.o. und der Sinn des zweiten Threads würde auch zumindest zu grossen Teilen flöten gehen.

    basedow



  • Gehört das dann nicht in das WinAPI-Forum?


Anmelden zum Antworten