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

Reply via email to