Я начинаю использовать 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;
Примеры проектов: