首页 > 解决方案 > 以不同的形式停止 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.

标签: multithreadingdelphitask

解决方案


推荐阅读