[Lazarus] Callback and Threads problem

Leonardo M. Ramé l.rame at griensu.com
Fri Apr 6 15:04:00 CEST 2012


On 2012-04-06 14:53:13 +0200, michael.vancanneyt at wisa.be wrote:
> 
> 
> On Fri, 6 Apr 2012, Leonardo M. Ramé wrote:
> 
> >On 2012-04-06 14:39:10 +0200, michael.vancanneyt at wisa.be wrote:
> >>
> >>
> >>On Fri, 6 Apr 2012, Leonardo M. Ramé wrote:
> >>
> >>>I have a similar problem to this:
> >>>
> >>>http://www.lazarus.freepascal.org/index.php?topic=10571.0
> >>>
> >>>My main program launches a thread, that loads a shared library, then
> >>>execute a function who receives as a parameter a pointer to a callback
> >>>function and an instance of the caller, as this:
> >>>
> >>>procedure TMythread.execute;
> >>>begin
> >>>...
> >>>// external function
> >>>runcode(@MyCallBack, @Self);
> >>>...
> >>>end;
> >>>
> >>>procedure MyCallback(const Result: PAnsiChar; const ACaller: pointer);
> >>>cdecl;
> >>>var
> >>>lCaller: TMythread;
> >>>begin
> >>>// the parameter ACaller is used because callbacks can't be of type
> >>>// procedure of object.
> >>>lCaller := TMyThread(ACaller);
> >>>lCaller.TestVar := Result; // <--- Ok.
> >>>lCaller.ListOfThings.Add;  // <--- SIGSEGV
> >>
> >>IMHO the problem is not in threads.
> >>
> >>You cannot pass objects to libraries or vice versa.
> >>The VMTs will differ.
> >>
> >>Michael.
> >
> >But, I'm passing the object as a pointer that is received as (void *) and
> >returned back to the callback as a parameter, the library doesn't touch
> >it. Even in this case I can't pass an object?.
> 
> Ah. In that case you can, yes.
> 
> Is the calling convention correct ?
> 
> Michael.

Yes, I'm using cdecl.

BTW. I somewhat fixed the issue by defining a global variable of the
same type of my thread, the var points to "Self" just before calling the
external function and assigned to nil when the function ends.

This way, the callback can use the thread by pointing to the global var.

I hate to use global variables, but, as the function is called only
once, I know it won't be overlapped by many callers.

Regards,
-- 
Leonardo M. Ramé
http://leonardorame.blogspot.com




More information about the Lazarus mailing list