[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