Delphi 10.1 berlin TTask存在的二个问题
(2016-07-21 20:49:50)
标签:
it |
分类: Delphi10.1 |
问题一:
在使用TTask的过程中,发现了问题,到QC上查,有人提出了,
地址在这里,官方已经Open。
具体来说,看提出者写的代码:
procedure TForm1.StartClick(Sender: TObject);
var I: Integer;
begin
for I := 1 to 25 do
begin
TTask.Create(
procedure
begin
sleep(maxint);
end).start;
end;
label1.Text := 'Start';
TTask.Create(
procedure
begin
TThread.Synchronize(nil,
procedure
begin
label1.Text := 'Executed';
end);
end).start;
end;
这段代码首先建立了25个长时间执行的任务,然后显示Lable1,再开启一个线程,同步显示Lable1.结果就是Lable1.Text:='Start'及下面的代码得不到执行。
这个问题暂时的解决方法就是自己设置线程池最小的线程数来解决,在官方的回复中也可看到。
问题二:
这个问题还没人提,那就是:
TTask.WaitForAll(tasks);
如果tasks执行时间长,这个WaitForAll不会等待就继续了.实际上看TTask.WaitForAll(tasks),是执行的
Result := DoWaitForAll(Tasks,
INFINITE);,也就是用最长的超时时间等任务结束。
这个问题暂时解决的办法就是自己加个超时间,如:
TTask.WaitForAll(tasks,1000*30);
在使用TTask的过程中,发现了问题,到QC上查,有人提出了,
地址在这里,官方已经Open。
具体来说,看提出者写的代码:
procedure TForm1.StartClick(Sender: TObject);
var I: Integer;
begin
end;
这段代码首先建立了25个长时间执行的任务,然后显示Lable1,再开启一个线程,同步显示Lable1.结果就是Lable1.Text:='Start'及下面的代码得不到执行。
这个问题暂时的解决方法就是自己设置线程池最小的线程数来解决,在官方的回复中也可看到。
问题二:
这个问题还没人提,那就是:
TTask.WaitForAll(tasks);
如果tasks执行时间长,这个WaitForAll不会等待就继续了.实际上看TTask.WaitForAll(tasks),是执行的
这个问题暂时解决的办法就是自己加个超时间,如:
TTask.WaitForAll(tasks,1000*30);