[Lazarus] Mutlithreaded Dll Callback crashes my Application

Alexander Grau alex at grauonline.de
Wed Aug 25 16:12:46 CEST 2010


Sven Barth schrieb:
> Am 25.08.2010 15:46, schrieb Alexander Grau:
>> Sven Barth schrieb:
>>> You can read this thread on the fpc-pascal list:
>>> http://www.hu.freepascal.org/lists/fpc-pascal/2010-July/025939.html
>>>
>>> Jonas has implemented a possibilty for external C threads to work, but
>>> you need to use a SVN FPC and you need to create at least one thread
>>> in FPC (it can terminate immediatly, it's just needed to initialise
>>> the threading subsystem). (And this fix is *nix only)
>> If you read this thread carefully, you can notice that I already posted
>> this here in my first answer to Maik ;-)
>>
>
> That was on 3rd August... How am I supposed to remember this? :P
>
>> I also showed in a test program in a later post that this problem
>> doesn't seem to exist in the Win32 target, it was just the Darwin
>> target. Here's again the test program I wrote . I creates a non-FPC
>> thread and inside that thread it calls back a FPC funtion and object.
>> This fully works without crashes.
>>
>
> I looked at your example program and I also looked into FPC's Thread 
> implementation for Windows. You need to play around with the Heap a 
> bit more to make things interesting:
>
> Modify someFunc like in the following and someObj.someMethod won't be 
> executed any more, 
Using exactly your modifications, all code ist executed correctly - the 
line you indicated is correctly reached and executed. No exceptions at all.

I'm using FPC 2.4.0 for all my tests   -   I'm assuming you are using  
2.2.4 ?   (If that is the case  there must have been a fix for this to 
make this bug gone away).



> because an exception is raised somewhere after the second Writeln.
>
> Regards,
> Sven
>
>
> procedure someFunc(param: pchar); cdecl;
> var
>   t: TObject;
> begin
>   WriteLn('External is called - ThreadID=', GetCurrentThreadId);
>   if assigned(param) then writeln('blub');
>   writeln('param=', param);
>   t := TObject.Create;
>   try
>     Writeln(t.ClassName);
>   finally
>     t.Free;
>   end;
>   // this point will not be reached
>   someObj.someMethod();
> end;
>
>
> -- 
> _______________________________________________
> Lazarus mailing list
> Lazarus at lists.lazarus.freepascal.org
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
>





More information about the Lazarus mailing list