On Tue, 20 Mar 2018, Anthony Walter wrote:
Okay, but the problem with the current implementation in Classes.pas is
that Status cannot be used, Terminated cannot be checked, and there is no
access to Synchronize.
All wrong. See below.
As such OnStatus is pointless, and the semantics of
checking Terminated doesn't work. If that's how the these
ExecuteInThread class methods on TThread are going work then they should be
removed because they don't have significant function and likely would
confuse users.
Eg. of confusion when trying to use ExecuteInThread Q: How does OnStatus
work? A: It doesn't.
And why doesn't it ?
You must obviously pass a callback. Just as in asynchronous programming.
Of course your function must call it from time to time.
Q: How can I check if my thread method is terminated?
By passing aOnTerminate ?
If you mean inside the thread, use TThread.CheckTerminated.
This is a class function.
or use TThread.CurrentThread.Terminated;
A: Forget about Thread.Terminated, you'll need to set a flag somewhere or
create you own solution. Q: How can I suspend my method and safely join the
main thread, because I normally use Synchronize? A: You'll have to do
without Synchronize or maybe figure out a workaround.
You can perfectly call Synchronize. It is a class method:
Procedure MyThreadHandlerFunction ;
begin
TThread.Synchronize(CurrentThreead,SomeMethod);
end;
So IMO ExecuteInThread should either be removed or these problems should be
fixed.
IMO you should check the documentation a little more thorough.
https://www.freepascal.org/docs-html/current/rtl/classes/tthread.executeinthread.html
It contains 4 examples that show how things work.
Michael.
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal