[fpc-pascal] TThread.FreeOnTerminate
Luca Olivetti
luca at ventoso.org
Fri Dec 14 11:09:24 CET 2018
El 13/12/18 a les 20:36, Martin Frb ha escrit:
> 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.
>
I think that TThread should have a method to kill it for such cases,
using, e.g., pthread_cancel under unix or TerminateThread under windows
(though the latter is not a very good option according to the
documentation).
Another possible solution for your use case could be to use the
OnTerminate callback and ignore the result if it's not your thread, e.g.
FMyThread:=TMyThread.Create(true);
FMyThread.OnTerminate:=@MyTerminate;
FMyThread.Start;
....
procedure TForm1.MyTerminate(Sender:TObject);
var t:tthread;
begin
if t=FMyThread then
begin
//do something with the thread results
FMyThread:=nil;
end;
t.free;
end;
The when you want to ignore the result of the thread, you just set
FMyThread to nil.
There's a problem though: when the application terminates and the thread
is still running, it will call MyTerminate possibly causing a segfault :-/
A solution to that could be to keep a list of running threads so that
you can set their OnTerminate to nil when terminating the application
and remove the thread of the list in MyTerminate.
Bye
--
Luca
More information about the fpc-pascal
mailing list