multithreading - 以不同的形式停止 ITask
问题描述
我有一个打开第二个表单的表单。
在第二个表单上,我开始了一个任务。此表单在关闭时是免费的,我需要使用全局变量测试该任务已分配且未取消,否则我会收到异常,因为该任务是免费的。
是否存在更好的方法来做到这一点?也许没有任何全局变量?
// [...]
type
TfrmTest = class(TForm)
nbRun: TNumberBox;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
private
FTaskNumber: ITask;
procedure RunTaskNumber;
end;
// [...]
procedure TfrmTest.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Assigned(FTaskNumber) then
FTaskNumber.Cancel;
Action := TCloseAction.caFree;
end;
procedure TfrmTest.FormCreate(Sender: TObject);
begin
FTaskNumber := nil;
end;
procedure TfrmTest.FormShow(Sender: TObject);
begin
RunTaskNumber;
end;
procedure TfrmTest.RunTaskNumber;
begin
FTaskNumber := TTask.Run(procedure
var
i: integer;
begin
i := 0;
while Assigned(FTaskNumber) and (FTaskNumber.Status <> TTaskStatus.Canceled) do
begin
Sleep(2000);
TInterlocked.Increment(i);
if Assigned(FTaskNumber) and (FTaskNumber.Status <> TTaskStatus.Canceled) then
begin
TThread.Queue(nil, procedure
begin
nbRun.Value := i;
end);
end;
end;
end);
end;
end.
解决方案
推荐阅读
- git - 如何从 VS 2019 中的合并冲突中获取所有“源”更改?
- c# - 如何始终在 winforms 应用程序中获取表单内的坐标?
- filter - 卷积神经网络 - 理论
- flutter - 如何在颤动中绘制具有某些定位的重叠 ractangles?
- powershell - 我们可以使用 ansible 在单个远程 Windows 服务器上运行 powershell 脚本吗?
- python - 使用循环在带有 groupby.sum 的子图中创建小倍数?
- web-scraping - 从不同页面抓取标题和副标题
- java - 具有抽象类继承的接口
- python - Python:将日期范围转换为具有相应值的时间序列
- c# - 在 C# 中发送 http 请求时,如何设置计时器或等待?