Indy同步ServerTCPExecute

vic*_*ico 5 delphi multithreading indy

我正在使用TIDTCPServer组件.据我所知,事件ServerTCPExecute(AContext: TIdContext) 不同步.同步它的最佳方法是什么?我需要将数据发送到主线程并让它们返回格式化答案.

我正在使用Indy 10.5.8.0.

方法1

是这样的我应该处理关键部分将数据从非同步函数传递到应用程序?

var data:string;
.
.
.
procedure MainThreadProcedure;
begin
  ...
end;
.
.
.
procedure IdTCPServerExecute(AContext: TIDContext);
var tmp: string;
begin
.
.
.
EnterCriticalSection(cs);
data:= tmp;
TIdYarnOfThread(AContext.Yarn).Thread.Synchronize(MainThreadProcedure);
LeaveCriticalSection(cs);
end;
Run Code Online (Sandbox Code Playgroud)

Rem*_*eau 12

正确的方法是使用Indy的TIdSync类,而不是直接访问Indy的内螺纹,例如:

uses
  ..., IdSync;

type
  TMySync = class(TIdSync)
  protected
    procedure DoSynchronize; override;
  public
    data: string; 
  end;

procedure TMySync.DoSynchronize;
begin
  // this runs in the main thread
  // use data as needed...
end;

procedure IdTCPServerExecute(AContext: TIDContext); 
var
  tmp: string;
  sync: TMySync; 
begin 
  tmp := ...;
  sync := TMySync.Create;
  try 
    sync.data := tmp; 
    sync.Synchronize;
  finally
    Sync.Free;
  end; 
end;
Run Code Online (Sandbox Code Playgroud)

只要小心你做的任何同步,无论是TIdSyncTThread.Synchronize().如果主线程在服务器尝试与主线程同步时尝试停用服务器,则会使主线程和服务器死锁.