TIdSync同步不正确

时间:2016-06-07 07:26:12

标签: delphi synchronization indy indy10

我遇到的问题是,当我同时在多个线程内同步Delphi 7(最新的Indy)中的TIdSync时,它会多次执行相同的TIdSync实例。
这是一个简单的代码。 TIdSync是在我的TThread中创建和调用的。对于这种情况,它应该传递并显示其句柄。但是我在备忘录中得到了一个包含相同句柄的列表。它在Delphi 2010+中正常工作(可能因为它支持匿名方法)。

我不确定我是否理解TIdSync应该如何工作,使用错误,还是存在错误或某些竞争条件?

type
  TMySync = class(TIdSync)
  protected
    procedure DoSynchronize; override;
  public
    FID: Integer;
  end;

type
  TTestThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

procedure TTestThread.Execute;
var
  sync: TMySync;
begin
  // synchronize some data
  sync:=TMySync.Create;
  try
    sync.FID:=Integer(sync); // this handle
    sync.Synchronize;
  finally
    sync.Free;
  end;
end;

procedure TMySync.DoSynchronize;
begin
  // show handle and stored handle
  Form1.Memo1.Lines.Add(IntToStr(Integer(Self))+' : '+IntToStr(FID));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  i: Integer;
begin
  // execute multiple threads
  for i:=0 to 10 do
    with TTestThread.Create(True) do
      Resume;
end;

我在Delph 7中得到这样的列表,其中包含相同的hadnles(因此它没有传递正确的值)
38972948:38972948
38970260:38970260
38970260:38970260
38970260:38970260
...

并且在Delphi 2010中它是正确的 39063248:39063248
39063296:39063296
39063312:39063312
39063328:39063328

如你所见,这是一个非常令人不快的问题。任何提示都表示赞赏。

1 个答案:

答案 0 :(得分:1)

请稍后再次检查以锁定内存地址的重用:

type
  TTestThread = class( TThread )
  private
    sync: TMySync;
  protected
    procedure Execute; override;
  public
    destructor Destroy; override;
  end;

{ TTestThread }

destructor TTestThread.Destroy;
begin
  inherited;
  sync.Free;
end;

procedure TTestThread.Execute;
begin
  inherited;
  sync    := TMySync.Create;
  sync.Id := Integer( sync );
  sync.Synchronize;
end;

正如您将看到的,一切都没有问题