2012-09-25 3 views
4

멀티 스레드 응용 프로그램이 있습니다.스레드의 Terminated 속성이 설정된 이유는 무엇입니까?

procedure TGridUpdater.Execute; 
begin 
    inherited; 
    CodeSite.Send('Thread executed'); 
    sp := ConnectionFactory.GetConnection.LoadStoredProc('rab_itemData'); 
    sp.CreateParam('Tahun', ftInteger, sppdInput).Value := _form.tahun; 
    sp.Open; 
    Synchronize(DoProgress1); 
    sp.DataSet.First; 
    I := 0; 
    CodeSite.Send('Terminated value is ' + BoolToStr(Terminated)); //The terminated property is 'True' here. Why? 

    while (not Terminated) and (not sp.DataSet.Eof) do 
    begin 
    CodeSite.Send('Entering loop'); 
    Synchronize(DoProgress); 
    I := I + 1; 
    sp.DataSet.Next; 
    end; 
    Synchronize(DoProgress2); 

end; 

방법 당신은 당신이 그것을 시작 직후 스레드를 해제하는 스레드를

procedure TFRABData.RefreshDataset; 
var 
    GridUpdater: TGridUpdater; 
begin 
    GridUpdater := TGridUpdater.Create(True); 
    GridUpdater.OwnerForm := Self; 
    GridUpdater.Start; 
    CodeSite.Send('RefreshDataset executed'); 
    GridUpdater.Free; 
end; 
+0

여기에 귀하의 질문이 정확히 무엇입니까? 나는 하나도 보지 못한다. –

+0

제 질문은 코드에 대한 주석입니다. –

+0

진행 상황 업데이트에주의하십시오. 하나의 스레드가 실행되고'RefreshDataset'이 호출되면, 다른 스레드를 시작하고 현재 실행중인 스레드를 종료합니다. 시간이 걸릴 수 있습니다. 그리고 당신은 같은 진행 상황을 업데이트 할 것입니다 ... – TLama

답변

10

를 실행합니다. 당신은 자신의 삶을 살아야합니다. 그래서 귀하의 질문에 대답하기 위해서는 스레드의 소멸자가 Terminated 플래그를 True로 설정합니다.

procedure TFRABData.RefreshDataset; 
var 
    GridUpdater: TGridUpdater; 
begin 
    GridUpdater := TGridUpdater.Create(True); 
    GridUpdater.OwnerForm := Self; 
    GridUpdater.Start; 
    CodeSite.Send('RefreshDataset executed'); 
    GridUpdater.Free; // <-- don't do this; let the thread live its own life 
end; 
관련 문제