동시에 여러 스레드에서 Delphi 7 (최신 Indy 포함)의 TIdSync를 동기화 할 때 동일한 TIdSync 인스턴스를 여러 번 실행한다는 문제점이 있습니다.
다음은 간단한 코드입니다. TIdSync가 만들어져 내 TThread 내부에서 호출됩니다. 이 경우 전달하고 처리해야합니다. 그러나 나는 메모에 같은 손잡이가있는 목록을 얻는다. 그것은 Delphi 2010+에서 올바르게 작동합니다 (아마도 익명 메소드를 지원하기 때문일 것입니다).TIdSync가 올바르게 동기화되지 않습니다.
TIdSync가 어떻게 작동해야하는지, 잘못 사용했는지 또는 버그가 있거나 경쟁 조건이 있는지 잘 모르겠습니까? 38972948
38970260 : 38970260
38970260 : 38970260
38970260 : 38970260
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;
나는 같은 hadnles와
38972948을 (그래서 잘 값을 전달하지 않습니다) 델프 7에서이 같은 목록을 얻을. ..
및 델파이 2010 년이
39,063,248 올바른 : 39063248
39063296 : 39 063296
39063312 : 39063312
39063328 : 39063328
당신이 보는 것처럼 매우 불쾌한 문제입니다. 어떤 힌트도 감사합니다.
'TTestThread'이 있어야합니다'FreeOnTerminate' 세트에서 아무 문제가 없습니다를 true로 설정하면 스레드 객체 유출을 피할 수 있습니다. 'Resume'은 사용하기에 안전하지 않습니다 (그리고 Delphi-XE 이후로 사용되지 않습니다). –
나는 이상한 행동을 볼 수 없다. 왜 그렇게 느끼게합니까? 문제가있을 경우 해당 코드를 표시하는 것이 최선의 방법은 아니지만. 사실 여기서 메모리 관리자 D7과 D2010의 다른 동작을 보았습니다. o) –
@LURD : 사실, FreeOnTerminate가 있어야하지만 문제는 발생하지 않습니다. 그냥 테스트 케이스. 이력서가 정확합니다 - 델파이 7입니다. – smooty86