Re: [Lazarus] TThread.Queue vs Application.QueueAsyncCall

2023-07-18 Thread Luca Olivetti via lazarus

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

--
___
lazarus mailing list
lazarus@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus


Re: [Lazarus] TThread.Queue vs Application.QueueAsyncCall

2023-07-18 Thread Mattias Gaertner via lazarus




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.



Mattias

--
___
lazarus mailing list
lazarus@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus