[Lazarus] local procedure - MultiThreadProc

Mattias Gärtner nc-gaertnma at netcologne.de
Wed Aug 19 14:12:39 CEST 2009


Zitat von Vincent Snijders <vsnijders at vodafonevast.nl>:

> Martin schreef:
>> Mattias Gärtner wrote:
>>> Zitat von Jan Kowalski <bor400 at gmail.com>:
>>>> I need to call ProcThreadPool.DoParallel with "local" procedure  
>>>> as a parameter.
>>>> Does DoParallel allow local procedures to pass a procedural parameters ?
>>>> I get err: Error:
>>>> Incompatible type for arg no. 1: Got "<address of local
>>>> procedure(Int64,Pointer,TMultiThreadProcItem);Register>", expected
>>>> "<procedure variable type of
>>>> procedure(Int64,Pointer,TMultiThreadProcItem);Register>"
>>>
>>> That would be really helpful.
>>> But I don't know how to define a local procedure type:
>>>
>> I wouldn't be sure it's possible. It makes no sense.

It makes enough sense in this case.
For example when you want to execute a loop in parallel, then you  
extract the loop into a procedure. With a local procedure you can keep  
the variables, which would make the process quite easy. If you can not  
use a local procedure, then you must define a record and move the  
local variables there.
Of course nested local procedures creates a whole bunch of problems,  
so maybe the record approach is much safer.
Maybe the extract procedure tool can be extended to do some of the  
monotone work automatically.
I will explain the process in more detail on the wiki.


>> My guess:
>> A local (nested) procedure has access to the outer(parent or  
>> grand-parent if recursive) procedures variables (stackframe).  
>> Therefore a local procedure must expect to be somewhere below this  
>> parent.
>>
>> If it was given as a pointer to some other procedure/object, and  
>> then called later, this may happen outside the parent. Then no such  
>> stackframe does exist, and the local procedure can not work.
>>
>
> And therefore such a local procedure type must be a combination of  
> local scope and address:  
> http://wiki.freepascal.org/Mac_Local_Procedure_Parameters
>
> This feature is not yet implemented:  
> http://wiki.freepascal.org/Language_related_articles#Ideas_for_new_stuff

Mattias





More information about the Lazarus mailing list