[fpc-pascal] TThread.FreeOnTerminate
Martin Frb
lazarus at mfriebe.de
Thu Dec 13 20:36:08 CET 2018
On 13/12/2018 19:52, Yuriy Sydorov wrote:
> On 12/13/2018 1:06 PM, Martin wrote:
>> Is there a way to use FreeOnTerminate other that setting it in the
>> constructor (or before the thread starts / or in the rather complex
>> manner below)?
>>
>> The doc does not mention any limitations
>> https://www.freepascal.org/docs-html/rtl/classes/tthread.freeonterminate.html
>>
>> However, setting FreeOnTerminate*after* Execute() has finished has no
>> effect.
>
> The question is why you need to set FreeOnTerminate after starting a
> thread?
> FreeOnTerminate is designed for threads which you start and forget
> about them because accessing the thread object is dangerous for such
> threads.
> If you need to access the thread object or control the thread's
> lifetime never use FreeOnTerminate.
> To stop such thread use the code like this:
>
> t.Terminate;
> tm:=GetTickCount64;
> while not t.Finished do
> begin
> sleep(10);
> // Check for timeout, the thread does not respond
> if GetTickCount64 - tm > 10000 then
> begin
> // Do something such as try to kill the thread
> break;
> end;
> end;
>
> if t.Finished then
> t.Free;
The thread may makes calls (several, one after the other) into a
library, and each of those calls may not return for some time (to long
for the main thread to wait, without the app becoming unresponsive). And
the structure of that library may not be possible to change.
The main thread launches the thread as a request that it will need the
data.
The main thread will have several different such workers (or other
sources, that will return a result after some time).
Normally the main thread will collect all the info. But if (due to user
abort, or error in one info-source) the info is no longer required, then
the request should be aborted.
Of course the main thread could keep all the pending-abort thread
objects, wait for them to stop, and deal with it. That however is much
more work, given that depending on what happens next, the entire infra
structure of the main thread may need to be freed, or may need to be
used for the next request (and then would need extra space to hold the
pending-abort).
Since a thread can destroy itself, it is reasonable to make use of it.
Once it is no longer needed, it can be abandoned.
----
Besides, the documentation does not say that FreeOnTerminate is limited
to be used in the thread construction. Especially since its effect is
not due until "terminate"
Further the name does *not* indicate, if "OnTerminate" means when
"execute" exits (the thread actually terminates), or it means when
"terminate" is called, or both.
The documentation also does *not* say, that "FreeOnTerminate" is not
thread safe (on a method of TThread you would expect thread safety,
unless otherwise documented).
Yet if FreeOnTerminate is used while the thread is running, the result
is unpredictable....
I am not saying that FreeOnTerminate has to be changed (I am asking if
it might be useful to change it).
But if not changed, then probably the doc, wants to be much more specific.
More information about the fpc-pascal
mailing list