Multithreading 为什么设置线程的Terminated属性?

Multithreading 为什么设置线程的Terminated属性?,multithreading,delphi,Multithreading,Delphi,我有多线程应用程序 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;

我有多线程应用程序

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;

启动线程后立即释放线程。你必须让它过自己的生活。为了回答您的问题,是线程的析构函数将标志设置为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;
过程TFRABData.RefreshDataset;
变量
GridUpdater:TGridUpdater;
开始
GridUpdater:=TGridUpdater.Create(True);
GridUpdater.ownPerform:=Self;
GridUpdater.Start;
发送('RefreshDataset executed');

GridUpdater.Free;//你的问题到底是什么?我没有看到。我的问题是关于代码的评论。只是小心进度更新。当您运行一个线程,然后调用
RefreshDataset
时,您将启动另一个线程并终止当前运行的线程,这可能需要一些时间。而且,您将更新相同的进度…是的,我刚刚意识到,要停止当前线程,它必须等待存储的进程完成执行,并且它仍然需要一些时间并使UI冻结..UI不应该冻结,UI线程是分离的。是的,线程在完成其
Execute
方法执行时终止。那么,尽快完成它的唯一干净方法就是尽可能多地请求
终止
标志,并在它为真时退出,但您仍将等待长时间运行的操作(当然,如果它们不能取消的话)。这就是为什么我放弃了我的单线程想法。