Как отменить IOmniParallelSimpleLoop? - PullRequest
0 голосов
/ 17 декабря 2018

Я начинаю использовать OTL для простого проекта, но в настоящее время застрял при остановке и перезапуске простого параллельного цикла.

Вариант использования

пользователь может запустить запрос для разрешения имен хостов в списке IP-адресов, нажав кнопку.В любой момент он может нажать кнопку обновления, которая остановит текущий цикл (CancelParallelResolveHostnames) и перезапустит разрешение имени хоста (StartParallelResolveHostnames).

Но во всех моих реализациях исполняемый файл заблокирован при ожидании FParallelResolveHostnamesWait илипросто когда я пытаюсь установить FParallelResolveHostnames равным nil.

Я также заметил, что обратный вызов OnStop не вызывается при отмене цикла.Это нормальное поведение?

Ссылки

Пример кода

var
  FAddressToProcess: TStringList;
  FParallelResolveHostnames: IOmniParallelSimpleLoop;
  FParallelResolveHostnamesCancelToken: IOmniCancellationToken;
  FParallelResolveHostnamesWait: IOmniWaitableValue;

procedure TGuiConnections.StartParallelResolveHostnames;
var
  TaskConfig: IOmniTaskConfig;
begin
  FParallelResolveHostnamesWait := CreateWaitableValue;
  FParallelResolveHostnamesCancelToken := CreateOmniCancellationToken;
  TaskConfig := Parallel.TaskConfig;
  TaskConfig.SetPriority(TOTLThreadPriority.tpLowest);

  FParallelResolveHostnames := Parallel               //
    .For(0, FAddressToProcess.Count - 1)              //
    .TaskConfig(TaskConfig)                           //
    .CancelWith(FParallelResolveHostnamesCancelToken) //
    .NoWait                                           //
    .OnStop(
    procedure
    begin
      FParallelResolveHostnamesWait.Signal;
    end); //
  FParallelResolveHostnames.NoWait.Execute(
    procedure(i: Integer)
    begin
        ResolveHostname(i, FAddressToProcess[i]);
    end);
end;

procedure TGuiConnections.CancelParallelResolveHostnames;
begin
  if Assigned(FParallelResolveHostnamesCancelToken) then
  begin
    FParallelResolveHostnamesCancelToken.Signal;
  end;
  if Assigned(FParallelResolveHostnamesWait) then
  begin
    FParallelResolveHostnamesWait.WaitFor();
    FParallelResolveHostnamesWait := nil;
    FParallelResolveHostnames := nil;
    FParallelResolveHostnamesCancelToken := nil;
  end;
end;

Примеры проектов:

...