On 10/04/2011 11:37 AM, Frank Church wrote:
What is the purpose of the while not Terminated in a threads execute loop?
If a thread is doing its own thing and knows when or not it has
finished what is the purpose of the while not Terminated
In Lazarus (and Delphi), "Worker Threads" can't have an "Event Loop" and
so "event driven programming" (using "On..." procedures for the user
code) is not possible. That is why in a Thread the user needs to create
the "Loop" himself. Such a Thread should always run to a stall in some
blocking library functions, lest it will take 100 % CPU time.
Is Terminated designed to be called by other procedures besides the
thread itself? Can a thread be Terminated externally?
This also seems to imply that if the code within the while not
Terminated loop is a long running sequence a Termniate command will
not be processed until control returns to the beginning of the loop
A thread should terminate itself by exiting the Execute procedure. If
not "FreeOnTerminate" is set. after termination the main thread should
free the TThread object.
Can a thread respond to a new Execute command while it already Executing?
No.
Do threads have ways of being interrogated about their state while
Executing?
There are lots of ways of doing inter-thread communication. Simplest:
any (no "ThreadVar") variable can mutually be read and written. A good
(portable) way of notifying the Main thread about a state change is
"Application.QueueAsyncCall". "TThread.Synchronize" calls a main thread
event while stalling the thread for some indefinite amount of time.
Suspend and Resume have been deprecated, and I want to know how a
thread can be suspended.
Using Semaphores like "TCriticalSection".
If a thread is not set to FreeOnTerminate, can a thread suspend itself
by using Terminate or some other custom function, doing some clean ups
and waiting so it can be restarted by the Start procedure, by adding
some custom fields to make it itself aware that it is an a paused
state, so that when an Execute is sent it look up those fields, set
Terminated to false and continue as though nothing has happened?
In certain applications (if it is not supposed to stall and wait) the
main thread needs to check multiple times whether a TThread instance in
fact is "Terminated" and thus can be freed.
-Michael
--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus