[Lazarus] TThread.Queue vs Application.QueueAsyncCall
Luca Olivetti
luca at wetron.es
Tue Jul 18 14:23:08 CEST 2023
El 18/7/23 a les 13:50, Mattias Gaertner via lazarus ha escrit:
>
>
> On 17.07.23 19:01, Luca Olivetti via lazarus wrote:
>> Hello,
>>
>> TThread.Queue and Application.QueueAsyncCall more or less do the same
>> thing (even if they use two different queues that are managed at
>> different times in the main thread).
>>
>> When it's better to use one or the other?
>
> Application.QueueAsyncCall has a Data: PtrInt parameter to pass some
> context and it is always called later, so this is useful for doing
> something after the current LCL event.
> TThread.Queue has aThread parameter, so the call is removed when the
> thread is freed, and when you call it from the main thread it will
> execute immediately, so this is for worker threads to asynchronously do
> something in the main thread.
Yes, but they both allow the thread to run something asynchronously in
the main thread (at different times but that's not really a concern).
Both put the method in a list and try to wake the main thread (if possible).
The main difference I see is that passing volatile data(*) is a little
more convoluted with TThread.Queue(**) than with
Application.QueueAsyncCall, but apart from that I see no big
differences, that's why I'm asking when it's better to use one or the
other (or if it doesn't really matter).
(*) i.e. data that the thread can potentially modify *before* the main
thread executes the method, but you want the main thread to see the data
as it was when it was queued, like the example here
https://wiki.freepascal.org/Asynchronous_Calls#Record_passed_to_async_function
(**) you need to create a class instance that stores the data and frees
itself after executing the method.Maybe, due to the overhead of doing
that, it's better to use QueueAsyncCall in these cases.
Bye
--
Luca Olivetti
Wetron Automation Technology https://wetron.es/
Tel. +34 93 5883004 (Ext.3010) Fax +34 93 5883007
More information about the lazarus
mailing list