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
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus