[Lazarus] local procedure - MultiThreadProc

Martin lazarus at mfriebe.de
Wed Aug 19 14:20:23 CEST 2009


Mattias Gärtner wrote:
> 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.

Sorry badly worded on my behalf.

It makes no sense, should have been: it can not be used the same way 
like normal procedure references, because it is limited to the scope.
the way described on the link by Vincent indeed makes sense

> 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
>
>
> -- 
> _______________________________________________
> Lazarus mailing list
> Lazarus at lists.lazarus.freepascal.org
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus





More information about the Lazarus mailing list