Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi PostMessage vs. SendMessage (https://www.delphipraxis.net/122733-postmessage-vs-sendmessage.html)

ToFaceTeKilla 21. Okt 2008 09:01


PostMessage vs. SendMessage
 
Hiho zusammen,

ich hab mal ne Frage bezüglich der oben genannten Funktionen:
Ist es theoretisch möglich, das SendMessage von PostMessage überholt wird? Also dass die Message von Post eher ankommt als von Send?

Thx schonma

Luckie 21. Okt 2008 09:12

Re: PostMessage vs. SendMessage
 
Nachrichten, die mit SendMessage gesendet werden, rufen direkt die Fensterprozedur des zugehörigen Fenster auf. Nachrichten, die mit PostMessage gesendet werden, werden ich die Nachrichtenschlange des Fenster angereiht.

ToFaceTeKilla 21. Okt 2008 09:24

Re: PostMessage vs. SendMessage
 
Ja, ich weis. Deswegen stell ich ja die Frage, ob es unter bestimmten Umständen möglich wäre. Weil so von der Logik her, müsste Send ja eher ankommen, da dort ja nicht gewartet wird. Könnte es da irgendwelche besondere Umstände geben, die diese Logik außer Kraft setzen?

Luckie 21. Okt 2008 09:36

Re: PostMessage vs. SendMessage
 
Mir sind keine bekannt.

ToFaceTeKilla 21. Okt 2008 10:05

Re: PostMessage vs. SendMessage
 
Hm okay, dann danke ich dir.

negaH 21. Okt 2008 12:27

Re: PostMessage vs. SendMessage
 
Zitat:

Ist es theoretisch möglich, das SendMessage von PostMessage überholt wird? Also dass die Message von Post eher ankommt als von Send?
Nein und darf es auch nicht.

Alle Nachrichten die mit PostMessage() versendet wurden werden in der Anwendungs-Message-Bearbeitung-Schleife abgearbeitet. Das wäre dann Application.Run und innerhalb dieser wird mit einer Endlosschleife per GetMessage(), TranslateMessage() und DispatchMessage() dieser Messagequeue ausgelesen und verarbeitet. Üblicherweise ruft man dazu Application.ProcessMessages; auf.
SendMessage() dagegen sendet die Nachricht direkt an die Fenster.

Nur wenn der Entwickler konzeptionell nicht das Windowsmessagesytem verstanden hat wird er unter Umständen in einer Message Methode die per SendMessage() aufgerufen wird, einen "asynchronen" und im Grunde "illegalen" Aufruf von Application.ProcessMessages;, der den Queue leert, kann der Eindruck entstehen das Nachrichten die mit PostMessage() versendet wurden früher als die mit SendMessage() gesendeten, eintreffen.

Also

1.) PostMessage(Window, cm_Test);
2.) SendMessage(Window, wm_user);
2.1.) im Fenster wm_User empfangen in Messagemethode
2.2.) darin wird Application.ProcessMessages aufgerufen und somit Message cm_Test abgearbeitet
3.) Program läuft weiter

Gruß Hagen

ToFaceTeKilla 21. Okt 2008 12:40

Re: PostMessage vs. SendMessage
 
Sehr schön, danke für die ausführliche Antwort :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz