[Lazarus] Mutlithreaded Dll Callback crashes my Application

Alexander Grau alex at grauonline.de
Wed Aug 25 17:50:20 CEST 2010


Maik Wojcieszak schrieb:
> Alexander,
>
> Not only writeln crashes the app. It is not really predictibable what 
> exactly crashes the app.
> normally it should be ok to use PostMessage inside a thread to send a 
> message to the main thread. BUT
> doing this crashes the app immediatly.
I can confirm now that the FPC runtime seem to have a problem when 
external threads calling it. It works fine when using FPC threads. See 
my latest test program in my previous post to Sven.



>
> Maik
>
> Alexander Grau schrieb:
>> Maik,
>>
>> As you did, I did write a new test program - this one uses 30 threads 
>> - it works fine (no crash) until the moment I enable the a simple 
>> 'writeln' inside a callack. You can see that it works by the 
>> increased counters for each thread that are displayed after the 
>> program successfully finished.
>>
>> So:  external multiple threads calling fine until you use FPC runtime 
>> code :/ ...
>>
>>
>> Regards,
>> Alexander
>>
>>
>> program project1;
>>
>> {$mode objfpc}{$H+}
>>
>> uses
>>  {$IFDEF UNIX}{$IFDEF UseCThreads}
>>  cthreads,
>>  {$ENDIF}{$ENDIF}
>>  Classes,
>>  sysutils
>>  { you can add units after this };
>>
>> {$R project1.res}
>>
>> type
>>  MT_THREAD_HANDLE   = Pointer;
>>
>>  tdummy = class
>>    idx: integer;
>>    constructor create();
>>    procedure test;
>>  end;
>>
>>
>> function vcmtdll_NewThread: MT_THREAD_HANDLE; cdecl; external 
>> 'vcmtdll.dll';
>> procedure vcmtdll_DeleteThread(ahandle : MT_THREAD_HANDLE); cdecl; 
>> external 'vcmtdll.dll';
>> procedure vcmtdll_RegisterCallback(ahandle : MT_THREAD_HANDLE; 
>> pCBFunc : Pointer; pCBData : Pointer); cdecl; external 'vcmtdll.dll';
>> procedure vcmtdll_StartThread(ahandle : MT_THREAD_HANDLE; iDelay : 
>> Cardinal); cdecl; external 'vcmtdll.dll';
>>
>> const
>>  COUNT = 30;
>>
>> var
>>  handles: array[1..COUNT] of MT_THREAD_HANDLE;
>>  objects: array[1..COUNT] of tdummy;
>>
>>
>> constructor tdummy.create();
>> begin
>>  inherited create;
>>  idx:=0;
>> end;
>>
>> procedure tdummy.test;
>> begin
>>  inc(idx);
>> end;
>>
>> procedure OnExecuteClb(pCBData : Pointer); cdecl;
>> var
>>  i: integer;
>> begin
>>  //  writeln('onExecuteClb');  <-- this line will crash
>>  for i:=1 to 30 do
>>    tdummy(pCBData).test();
>> end;
>>
>> var
>>  i: integer;
>>
>> begin
>>  writeln('start');
>>  for i:=1 to COUNT do objects[i]:=TDummy.create;
>>
>>  for i:=1 to COUNT do
>>    Handles[i]  := vcmtdll_NewThread();
>>
>>  for i:=1 to COUNT do
>>    vcmtdll_RegisterCallback(handles[i], @OnExecuteClb, objects[i]);
>>
>>  for i:=1 to COUNT do
>>    vcmtdll_StartThread(handles[i], 1000);
>>
>>  writeln('go');
>>  sleep(2000);
>>
>>  writeln('freeing');
>>  for i:=1 to COUNT do
>>    vcmtdll_DeleteThread(handles[i]);
>>
>>  for i:=1 to COUNT do writeln(objects[i].idx);
>>
>>  writeln('bye');
>> end.
>>
>>
>>
>>
>> Maik Wojcieszak schrieb:
>>> Alexander,
>>>
>>> I tried you're test app already and it worked as you said. So does 
>>> my test app if I do only one thing at time. After changing you're 
>>> test app to process
>>> multiple threads at the same time it crashed too.
>>>
>>> Alexander Grau schrieb:
>>>>
>>>>
>>>> Maik,
>>>>
>>>> Did you try out the console test program I posted? It uses your DLL 
>>>> that runs a C thread and that C thread calls back the FPC function. 
>>>> Even more, this FPC callback function then calls a FPC object method.
>>>>
>>>> My program shows that there is nothing wrong with FPC (on Win32) 
>>>> and external C threads - it just works.
>>> Well, it doesn't if you stress this stuff a bit.
>>>>
>>>> My assumption :  there is something else wrong in your code - use 
>>>> my code and add one piece after the other of your code. For 
>>>> example, first just try to make my test app a simple LCL app (just 
>>>> a simple form). If that works too, add the dynamic function mapping 
>>>> you used. If that works too, make the wrapper (TComponent) you 
>>>> wrote etc.
>>> The question is: What is wrong ?
>>>>
>>>> Again : You can call FPC functions/objects in external C threads - 
>>>> there must be something else wrong in your program ;-) ...
>>> ...
>>>
>>> I've choosen the vortex (beep )binding as an example because my dll 
>>> does exactly the same.
>>> In fact it uses the vortex library to implement user protocols. 
>>> There must be a reason for those guys (and the
>>> vortex programmers) to add a mechanism to use a different threading 
>>> when using FPC.
>>> At the moment I will follow this idea to check if it solves my 
>>> problem and post my result here.
>>>
>>> Maik
>>>
>>>
>>> -- 
>>> _______________________________________________
>>> Lazarus mailing list
>>> Lazarus at lists.lazarus.freepascal.org
>>> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
>>>
>>
>>
>> -- 
>> _______________________________________________
>> Lazarus mailing list
>> Lazarus at lists.lazarus.freepascal.org
>> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
>>
>
>
> -- 
> _______________________________________________
> Lazarus mailing list
> Lazarus at lists.lazarus.freepascal.org
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
>





More information about the Lazarus mailing list