[Lazarus] Mutlithreaded Dll Callback crashes my Application

Maik Wojcieszak maikwo at googlemail.com
Wed Aug 25 17:25:16 CEST 2010


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.

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
>





More information about the Lazarus mailing list