[Lazarus] Sending messages

Hans-Peter Diettrich DrDiettrich1 at aol.com
Fri Nov 25 22:57:34 CET 2011


zeljko schrieb:
> On Friday 25 of November 2011 14:33:16 Hans-Peter Diettrich wrote:
> 
> 
>  > And how does PostMessage fit into the picture?
> 
> 
> I'm using PostMessage in an audio application to update position of 
> trackbar on mainform from another thread where audio file is loaded and 
> playing and it works ok (tested qt and gtk2)

This looks like PostMessage is thread-safe, but is not a proof.

About multiple queues: do LCL forms have an owning thread?
On Windows the owning thread is part of the window class data, but what 
about other widgetsets?

> ... and of course you 
> cannot test result of PostMessage since it can be executed at any time 
> after posting (depends when WS event queue will process your message)

That's documented behaviour.


> If you need to check for result you must use SendMessage() but in that 
> case you cannot use it from another thread (at least it does not work 
> with qt and gtk2 as I expected or I've misunderstood point of 
> SendMessage()).

I just wonder how a broadcast (to HWND_BROADCAST) works with 
SendMessage. But this is a feature that must not be supported for 
non-Windows platforms.

> Qt have similar mechanism: SendEvent() & PostEvent() and it works in 
> same way.

Are threads supported?


The more I try to understand the Lazarus message handling, the more 
questions arise :-(

Here's a snippet from the WinAPI SendMessage docs:
 >>
If the specified window was created by the calling thread, the window 
procedure is called immediately as a subroutine. If the specified window 
was created by a different thread, the system switches to that thread 
and calls the appropriate window procedure. Messages sent between 
threads are processed only when the receiving thread executes message 
retrieval code. The sending thread is blocked until the receiving thread 
processes the message. However, the sending thread will process incoming 
nonqueued messages while waiting for its message to be processed.
<<

The last sentences imply that the LCL *must* be reentrant, when 
intra-thread messages are implemented. But what about possible deadlocks 
then?

DoDi





More information about the Lazarus mailing list