为什么TThread不能在DLL中工作?但在VCL表单应用程序中工作



为什么这个线程过程不能在使用TIdTCPServer的DLL库中工作,但它可以在VCL表单应用程序中工作?

procedure TFormFpsSrv.Display(p_sender : String; p_message : string);
begin
TThread.Queue(nil, procedure
begin
memo1.Lines.Add(getNow + ' | '
+ p_sender + ' | ' + p_message);
end);
end;
procedure TFormFpsSrv.IdTCPServer1Connect(AContext: TIdContext);
var
port        : Integer;
begin
Display('Serveris',' | Prisijungta portas: '+IntToStr(port));
end;

在普通的DLL中,DLL和EXE都有各自的RTL副本,它们彼此不共享。因此,在DLL的代码中调用TThread.Synchronize()TThread.Queue()默认情况下是不能工作的,因为没有任何东西在后台运行来处理DLL的请求。

DLL将不得不导出一个调用CheckSynchronize()函数的函数来获取RTL的副本,然后EXE将需要定期调用导出的函数,例如在计时器中,或在TApplication(Events).OnIdle事件中。

这不是一个问题,如果你创建一个运行时包(BPL)而不是一个DLL,然后配置你的BPL和EXE都使用rtl运行时包,使它们共享相同的RTL实例。

相关内容