Indy同步ServerTCPExecute

时间:2012-08-29 10:00:03

标签: multithreading delphi 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;

2 个答案:

答案 0 :(得分: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;

请注意任何同步,无论是TIdSync还是TThread.Synchronize()。如果主线程在服务器尝试与主线程同步时尝试停用服务器,则会使主线程和服务器死锁。

答案 1 :(得分:0)

在我的应用程序中,我正在使用此代码:

procedure MainThreadProcedure;
begin
  ...
end;
.
.
.
procedure IdTCPServerExecute(AContext: TIDContext);
begin
  TIdYarnOfThread(AContext.Yarn).Thread.Synchronize(MainThreadProcedure);
end;

如果需要访问ServerTCPExecute

中的主要线程变量,请务必使用关键部分或其他同步对象