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

Reply via email to