1

我正在运行 Delphi XE2 并试图熟悉 OmniThreadLibrary,我安装了 3.03b。

我一直在查看 Parallel.ForEach 示例,但不确定后台发生了什么(这可能稍后会很明显 - 抱歉)。您可以提供任何信息来帮助我更好地了解如何实现我的目标,我们将不胜感激。

假设我有一些记录只是 2 个相关值 a 和 b 的容器。然后我想运行一个返回这些记录数组的并行循环。是否可以使用 OmniThreadLibrary 做到这一点?

例如,以 MultithreadingMadeSimple ForEachUnorderedPrimes 示例为基础,我可以执行以下操作:

    function GetMyRecordArray(n: Integer): myRecordArray; {Just a type of Array of myRecord}
    var
      a, b: Double;
      record: TOmniValue;
      recordQueue: IOmniBlockingCollection;
      i: Integer;
    begin
      SetLength(RESULT, n)
      recordQueue := TOmniBlockingCollection.Create;
      Parallel.ForEach(1, n).Execute(
        procedure (const value: integer)
          begin
            a := {SOME FUNCTION OF value};
            b := {SOME FUNCTION OF value};
            recordQueue.Add(myRecord.New(a,b));
          end;
        end);

      i := 0; 
      for record in recordQueue do 
      begin
        i := i + 1;
        RESULT[i - 1] := record;
      end;
    end;

我知道上面的代码示例存在一些非常基本的问题,但我希望你能理解我想要做什么。

4

1 回答 1

0

我对这个例子有些困惑——这个应用程序不需要队列。适当的示例代码是:

function GetMyRecordArray(n: Integer): myRecordArray; {Just a type of Array of myRecord}
var
  a, b: Double;
begin
SetLength(RESULT, n)
Parallel.ForEach(1, n).Execute(
    procedure (const value: integer)
      begin
        a := {SOME FUNCTION OF value};
        b := {SOME FUNCTION OF value};
        RESULT[value - 1] := myRecord.New(a,b);
      end;
    end);
end;

因此,您通常只使用 Parallel.ForEach 就可以做到这一点......

于 2014-11-18T00:17:34.697 回答