[fpc-pascal] TThread.FreeOnTerminate
Martin
fpc at mfriebe.de
Thu Dec 13 12:06:51 CET 2018
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.
So code like:
t := TThread.create(false); // create not suspended
// do something
if foo then begin // decide we do not need the result
t.FreeOnTerminate:= true;
t.terminate;
end;
This may fail. If the thread's execute already finished, then the thread
is not destroyed.
The code cannot call WaitFor, because the thread could still be running
for a long time. And even take a long time until it recognizes the
"terminate" request.
So the app wants just to signal it, and tell it to clean up after itself.
But in the above code, if Execute() had already finished, t is never
destroyed. (tested with 3.0.4)
One would have to test for Finished in addition. Only that Finished
could change between it being queried and any subsequent action.
So the only solution I can see is maybe
t := TThread.create(false); // create not suspended
// do something
if foo then begin // decide we do not need the result
t.Suspend;
if t.Finished then begin
t.free; // Not sure, since it is finished, we would not need to Terminate, WaitFor or Resume ?
t := nil;
end
else begin
t.FreeOnTerminate:= true;
t.terminate;
t.Resume;
t := nil; // no longer save to access
end;
end;
1) Is there an easier way?
2) Should the doc have any hint towards this?
3) Should FreeOnTerminate maybe detect this situation itself?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20181213/c38ce30f/attachment.html>
More information about the fpc-pascal
mailing list