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
方法执行时终止。那么,尽快完成它的唯一干净方法就是尽可能多地请求终止
标志,并在它为真时退出,但您仍将等待长时间运行的操作(当然,如果它们不能取消的话)。这就是为什么我放弃了我的单线程想法。