[Lazarus] A few questions on threads
Frank Church
vfclists at gmail.com
Tue Oct 4 12:53:50 CEST 2011
On 4 October 2011 11:14, Michael Schnell <mschnell at lumino.de> wrote:
> 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.
>
>
I am looking at Application.QueueAsyncCall and the only parameter it takes
in addition to the method pointer is a PrtInt. That seems to limit the
options passed compared with TThread.Synchronize. Can the PtrInt be cast to
a pointer to a richer data structure?
>
>> 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
> Lazarus at lists.lazarus.**freepascal.org<Lazarus at lists.lazarus.freepascal.org>
> http://lists.lazarus.**freepascal.org/mailman/**listinfo/lazarus<http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus>
>
--
Frank Church
=======================
http://devblog.brahmancreations.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus/attachments/20111004/1625073e/attachment-0003.html>
More information about the Lazarus
mailing list