我遇到的问题是,当我同时在多个线程内同步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
如你所见,这是一个非常令人不快的问题。任何提示都表示赞赏。
答案 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;
正如您将看到的,一切都没有问题