I know Synchronize
must be used in the Execute
procedure, but should it be used in Create
and Destroy
methods too, or is it safe to do whatever I want?
I know
Synchronize
must be used in the Execute procedure.
That is somewhat vague. You need to use Synchronize
when you have code that must execute on the main thread. So the answer to whether or not you will need to use Synchronize
depends crucially on what the code under consideration actually does. The question that you must ask yourself, and which is one that only you can answer, is do you have code that must run on the main thread?
As a general rule it would be considered prudent for you not to need to call Synchronize
outside the Execute
method. If you can find a way to avoid doing so then that would be wise. Remember that the ideal scenario with threads is that they never need to block with Synchronize
if at all possible.
You might also wish to consider which thread executes the constructor and destructor.
The constructor Create
runs in the thread that calls it. It does not run in the newly created thread. Therefore it is unlikely that you would need to use Synchronize
there.
The destructor Destroy
runs in the thread that calls it. Typically this is the thread that calls Free
on the thread object. And usually that would be called from the same thread that originally created the thread. The common exception to that is a FreeOnTerminate
thread which calls Free
from the thread.
There is a need to use Synchronize()
when the code is executing outside of the context of the main (GUI) thread of the application. Therefore the answer to your question depends on whether the constructor and destructor are called from that thread or not.
If you are unsure you can check that by comparing the result of the Windows API function GetCurrentThreadId()
with the variable MainThreadID
- if they equal the code executes in the context of the main thread.
Threads that have FreeOnTerminate
set will have their destructor called from another thread context, so you would need to use Synchronize()
or Queue()
. Or you use the termination event the VCL already provides, I believe it is executed in the main thread, but check the documentation for details.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With