2016-06-07 8 views
1

동시에 여러 스레드에서 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

당신이 보는 것처럼 매우 불쾌한 문제입니다. 어떤 힌트도 감사합니다.

+1

'TTestThread'이 있어야합니다'FreeOnTerminate' 세트에서 아무 문제가 없습니다를 true로 설정하면 스레드 객체 유출을 피할 수 있습니다. 'Resume'은 사용하기에 안전하지 않습니다 (그리고 Delphi-XE 이후로 사용되지 않습니다). –

+0

나는 이상한 행동을 볼 수 없다. 왜 그렇게 느끼게합니까? 문제가있을 경우 해당 코드를 표시하는 것이 최선의 방법은 아니지만. 사실 여기서 메모리 관리자 D7과 D2010의 다른 동작을 보았습니다. o) –

+0

@LURD : 사실, FreeOnTerminate가 있어야하지만 문제는 발생하지 않습니다. 그냥 테스트 케이스. 이력서가 정확합니다 - 델파이 7입니다. – smooty86

답변

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; 

당신이 볼 수 있듯이, 모든

+0

동일하게 작동합니다. D7에서 테스트 해 보았는데 제대로 작동 했습니까? – smooty86

+0

언제든지 스레드를 해제 했습니까? –

+0

FreeOnTerminate와 freeing하지 않고 둘 다 시도했습니다. – smooty86

관련 문제