4

Delphi XE2 で OmniThreadLibrary を使用する方法を学んでいます。

キャンセル トークンを使用する必要があると読みましたが、その使用方法に関する例が見つかりません。

これは、関数内の元の for ループです。

function SomeFunction() : string;
begin

  for value :=  0 to length(listOfThings)-1 do
  begin

    Chain := Function1( listOfThings[value] );

    if Evaluate( Chain , Solution) then
      Parameters[value] := Solution
    else
    begin
      Result := 'ERROR';
      exit;
    end;
  end;
end;

そして、これが私が Parallel.ForEach を使用している方法です

function SomeFunction() : string;
begin

  Parallel.ForEach(0, length(listOfThings)-1 ).Execute(

    procedure (const value: integer)
        var Chain : string;
        begin
          Chain := Function1(listOfThings[value]);

        if Evaluate(Chain , Solution) then
          Parameters[value] := Solution
        else
          begin
            Result := 'ERROR';    //Here is where it won't work
            exit;  
          end;
        end
  );
end;

Parallel.ForEach の内部は、プロシージャ内でキャプチャされていないため実行できません。Result := 'ERROR'そのため、Parallel.ForEach をキャンセルしてそのキャンセルを報告できれば、Result := 'ERROR'外部に割り当てるだけでよいと思います。

しかし、私は OmniThreadLibrary を初めて使用し、そのようなことを行う方法がわかりません。助けてください :)

4

2 に答える 2

0

キャンセル トークンを使用する必要があります。

var
  cancelToken: IOmniCancellationToken;

CreateOmniCancellationTokenユニットから呼び出してキャンセルトークンを取得しますOtlSync

cancelToken := CreateOmniCancellationToken;

次に、トークンを並列ループに提供します。

Parallel.ForEach(...)
    .CancelWith(cancelToken)
    .Execute(...);

Signalそして、そのメソッドを呼び出してキャンセル トークンを通知します。

cancelToken.Signal;

並列ループの外側から使用できます

cancelToken.IsSignaled

キャンセルしたことを検出します。または、周囲のスコープからブール変数をキャプチャし、その変数を介して情報を渡すことができます。

ここでの例は、説明を示しています。

于 2014-03-18T23:20:56.877 に答える