为什么这个线程过程不能在使用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实例。