[DUG] Windows Messages in a Thread

Ross Levis ross at stationplaylist.com
Mon Jul 18 17:29:25 NZST 2005


Hi Corey

Creating the AllocateHWnd inside the thread is what I didn't think of, 
Doh!  That will be the problem.  I gave up on that and just used 
Application.ProcessMessages to resolve the issue I had.  But using a 
thread would be much nicer and safer.

Cheers,
Ross.

----- Original Message ----- 
From: "Corey Murtagh" <emonk at xtra.co.nz>
To: "NZ Borland Developers Group - Delphi List" <delphi at ns3.123.co.nz>
Sent: Monday, July 18, 2005 4:35 PM
Subject: Re: [DUG] Windows Messages in a Thread


Ross Levis wrote:

> Similar to what I needed help with a few days ago.  I would like to 
> set
> up a thread to handle messages posted from a DLL using PostMessage.
> I've created a thread object with an extra variable to store the 
> handle
> from AllocateHWnd, and assigned this to the DLL's parent handle.
>
> I'm not sure whether I need to provide an Thread.Execute procedure 
> since
> I'm not executing anything.  I currently don't have one and I've set
> FreeOnTerminate to False.
>
> Messages are being received by the WndProc procedure defined in the
> thread object but I'm not so sure that messages are being processed as
> they arrive.  I may be wrong but I'm wondering if the WndProc
> procedure is executing in the main thread.
>
> Is what I have done sound right?

Sorry Ross, I haven't been paying much attention to the list recently.
Surprised you didn't get more response to this one.

In case you haven't already solved this problem by yourself, here are
some thoughts...

When Thread.Execute finishes, the thread terminates.  Not having a
Thread.Execute means that your thread will be VERY short-lived.

Messages get processed in the context of the thread that created the
handle.  If you create a handle in the main thread, then that's the
context the messages get processed in.  So you need to call AllocateHWnd
in the Thread.Execute - NOT in the Create or anything else that might
get executed from the main thread.

You need a message loop.  This is nicely abstracted in the depths of the
VCL - and I presume the CLX - but you need to do it manually in your own
thread or you won't get anything.  In a thread the message loop needs to
watch for quit messages and so on, check for thread termination
requests, call Translate and Dispatch to get messages to their
respective windows, etc.  You need to be aware of both Thread messages
and Window messages.

Hope some of that helps.  I'd give you some code, but I'm an evil C++
programmer, so I probably wouldn't be of much help there :> 



More information about the Delphi mailing list