Alexander,

This is the result of the test:

G:\Workdir HEAD\cb Test\thr_test>project1.exe
Main ThreadID=864
Creating external thread
External is called - ThreadID=6000
blub
param=test
TSomeClass.someMethod called

Freeing external thread

G:\Workdir HEAD\cb Test\thr_test>

it's ok, isn't it ?

Maik

Alexander Grau schrieb:
Maik,

I have written the counterpart of the "textthr.pp" test (I mentioned before) for Win32 below - it works for my compiler (release 2.4.0 ). Maybe you want to try it on your version (2.2.4) too.

Now I think your problem is more related to something inside the DLL (just another assumption). Try to do just a simple call inside your callback to that DLL, and do not create or pass FPC strings ('someString') and do not call anything from the FPC runtime (assigned(x)). If that it still does work, you have some call parameter issues. If it works, try to use more and more from the runtime (e.g. try to use PChar strings instead of strings)....

Regards,
Alexander



program project1;

{$APPTYPE CONSOLE}

{$mode objfpc}{$H+}


uses
 {$IFDEF UNIX}{$IFDEF UseCThreads}
 cthreads,
 {$ENDIF}{$ENDIF}
 Classes,
 { you can add units after this }
 windows;

{$R project1.res}

type
 TSomeClass = class
 public
   procedure someMethod();
 end;

procedure TSomeClass.someMethod();
begin
 writeln('TSomeClass.someMethod called');
end;


var
 ThreadID: DWORD;       //Thread-ID
 ThreadHandle: THandle; //Rückgabewert von CreateThread
 someObj: TSomeClass;


procedure someFunc(param: pchar); cdecl;
begin
 WriteLn('External is called - ThreadID=', GetCurrentThreadId);
 if assigned(param) then writeln('blub');
 writeln('param=', param);
 someObj.someMethod();
end;

function ExternalThread(zahl: Pointer): LongInt; stdcall;
begin
 //Sleep(2000);
 someFunc('test');
 Result:=0;
end;

begin
 WriteLn('Main ThreadID=', GetCurrentThreadId);
 someObj:=TSomeClass.create;

 WriteLn('Creating external thread');
ThreadHandle:=CreateThread(nil, 0, TFNThreadStartRoutine(@ExternalThread),
   nil, 0, ThreadID);
 if ThreadHandle = 0 then writeln('ERROR creating external thread');
 readln;

 WriteLn('Freeing external thread');
 if ThreadHandle<>0 then CloseHandle(ThreadHandle);

 someObj.free;
end.






Maik Wojcieszak schrieb:
Alexander,

Try the following to limit the problem: in your callback do not call *ANY* FPC runtime related code - Just a "Win32 MessagBox(0, "hi", "text", MB_OK)". Add the process id (GetProcessId) to that dialog output and also in your main program (to see if you are really in an external thread).

I am in an external thread.
If that works, call a simple global FPC function (no object) and again just that callback there.

After that works, just a simple FPC object call and again that message box.

I still assume in the compiler version you are using, you simply can't call FPC objects inside external threads.
this is the full code of the callback

procedure ExecuteCommandClb(tmlhandle : TML_COMMAND_HANDLE; pCBData : Pointer); cdecl;
var
 hsidex : SIDEX_HANDLE;
 val    : SIDEX_VARIANT;
begin
 tml_Cmd_Get_Sidex_Handle(tmlhandle,@hsidex);
 if assigned(hsidex) then
 begin
   val := sidex_Variant_New_Boolean(true) ;
   sidex_Variant_Write(hsidex,'Answer', 'Accept', val);
   sidex_Variant_DecRef(val);
 end;
end;

no FPC objects are called. I've thought that this might be the reason and changed the code to try, but it didn't work either.
All calls are API calls of my dll.

Also have a look at the mantis - e.g. see if 0012987 is related to your problem? (http://bugs.freepascal.org/view.php?id=12987)
This sounds pretty much like my problem.
I'm new to lazarus and I've downloaded the installer package as it is. Can I change the FPC Compiler without changing my current IDE and how can I do this ? I think it might be a good idea to use the current version to double check if the problem is still there. The latest release is 2.4.0. Why does the lazarus installer for windows install 2.2.4, it seems a little bit out of date ?


I might be fully wrong with my assumptions, I'm just thinking loudly because I had the same issue - just another architecture :-)
I am happy about any hint to solve this one. The dll is already ported to Linux and Mac OS-X and I've decided to use lazarus for
some demo applications.

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

Reply via email to