Ich verwende einen Application.OnMessage-Ereignishandler, um Nachrichten (Benachrichtigungen) von anderen Threads in meinem Programm zu verarbeiten. Und ich habe festgestellt, dass dieser Event-Handler nicht aufgerufen wird, wenn das Popup-Menü aktiv (geöffnet) ist. Der Testcode ist unten (es ist ohne Threads, aber das Prinzip ist das gleiche):
%Vor% OnMessage
wird von der Nachrichtenschleife des Haupt-Threads aufgerufen. Diese Nachrichtenschleife ist in Delphis VCL-Bibliothekscode implementiert. Daher hat dieser Bibliothekscode die Möglichkeit, den Ereignishandler für OnMessage
aufzurufen.
Das Popup-Menü wird durch Aufruf der Win32-Funktion TrackPopupMenuEx
angezeigt. Diese Funktion implementiert eine modale Nachrichtenschleife, um die Überwachungsbenutzeroberfläche für das Menü auszuführen. Da diese Nachrichtenschleife in Win32-Code implementiert ist, verfügt der VCL-Code nicht über die Möglichkeit, das Ereignis OnMessage
auszulösen. Der Win32-Code kennt die VCL nicht und führt eine einfache Nachrichtenschleife aus. Nachrichten werden bearbeitet und versendet, aber kein VCL-spezifischer Code kann ausgeführt werden.
Dies ist ein perfektes Beispiel dafür, warum PostThreadMessage
vermieden werden sollte. Nur wenn Sie jede Nachrichtenschleife kontrollieren, kann sie verwendet werden. Andere Fehlerpunkte umfassen Systemmeldungsdialoge, modale Schleifen mit Ziehen und Ablegen, modale Schleifen mit Fensterbewegung / -größe.
Sie sollten aufhören, PostThreadMesaage
zu verwenden. Erstellen Sie stattdessen ein Fensterhandle im Hauptthread mit AllocateHWnd
. Senden Sie Nachrichten von den Arbeitsthreads an dieses Fenster.
Tags und Links multithreading delphi