[Lazarus] Application.QueueAsyncCall()

Brad Campbell brad at wasp.net.au
Thu Jan 21 00:56:11 CET 2010


cobines wrote:
> 2010/1/20 Brad Campbell <brad at wasp.net.au>:
>> Is QueueAsyncCall() threadsafe?
> 
> As far as I know it is not.
> 
>> Let's say I have a communications child thread and I want to trigger a call
>> back in the main GUI thread. Traditionally I'd do something ugly like have a
>> timer polling a variable used as a flag, or polling a RtlEvent on a short
>> timeout, but this seems like a much nicer solution.
>>
> 
> You can call TThread.Synchronize(), your thread will be stopped until
> the GUI thread executes your function.

Yeah, but what I'm trying to do is have the main gui thread sit on its hands until it has a message 
waiting for it. Then I'd like to have it wakeup on an event rather than spinning or polling, while 
still remaining responsive to user input.

> Other solution is to create a separate thread for handling such GUI
> functions (take a look at attached source); this doesn't stop your
> child thread. Be careful however because in this case you don't
> control when your method is called (it may be after your thread is
> already finished).

That's a really interesting solution. I *thought* the issue was that the update of GUI elements must 
only be done in the main thread. I actually don't have a problem running the callbacks from the 
comms thread as the callbacks are executed between packets in a polled system, so it's not at all 
timing critical. I was more concerned with updating the GUI components in a threadsafe manner.

Unless I'm mistaken (and I'm pretty green at thread stuff still) it looks like you are running a 
separate thread that checks a message queue and runs the callbacks from there, so you are possibly 
updating gui components from a thread other than the main thread. Is that kosher?

Really appreciate the reply, it has been incredibly helpful.

Regards,
Brad
-- 
Dolphins are so intelligent that within a few weeks they can
train Americans to stand at the edge of the pool and throw them
fish.




More information about the Lazarus mailing list