在BackgroundWorker中使用TOmniValue数组中的字符串时出错

时间:2014-06-02 12:07:33

标签: delphi delphi-2009 omnithreadlibrary

当我在TOmniValue数组中有一个字符串时,按名称或显式索引访问该值会引发访问冲突。有关示例,请参阅以下代码。我做错了什么,或者Delphi或TOmniValue中是否有错误?我发现了一种通过索引访问的解决方法,但名称是什么?

更新:我已将Test转移到控制台应用程序中以便于再现,但现在错误只发生在每一次运行中,而不是每次交互。或者现在可能不是同样的错误?

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  OtlParallel,
  OtlCommon;

procedure Test;
const
  Count = 1000;
var
  i: integer;
  BackgroundWorker: IOmniBackgroundWorker;
begin
    BackgroundWorker := Parallel.BackgroundWorker.NumTasks(2)
      .Execute(
        procedure (const workItem: IOmniWorkItem)
        const Inx_ = 1;
        var Inx: integer;
        begin
          // Works:
          workItem.Result := 'Integer: '+workItem.Data[workItem.Data.AsArray.Count-1].AsString;
          // Works (but why?!):
          workItem.Result := 'Integer: '+workItem.Data[workItem.Data.AsArray.Count*0+Inx_].AsString;
          // Raises AV immediately:
          workItem.Result := 'Integer: '+workItem.Data[Inx_].AsString;
          // Raises AV immediately:
          Inx:=workItem.Data.AsArray.Count-1;
          workItem.Result := 'Integer: '+workItem.Data[Inx].AsString;
          // Raises AV later when workItem.Result is accessed:
          workItem.Result := 'Integer: '+workItem.Data['BB'].AsString;
        end
      )
      .OnRequestDone(
        procedure (const Sender: IOmniBackgroundWorker;
          const workItem: IOmniWorkItem)
        begin
          workItem.Result.AsString;
        end)
    ;
    for i := 1 to Count do begin
      BackgroundWorker.Schedule(BackgroundWorker.CreateWorkItem(
        TOmniValue.CreateNamed(
          [
            'AA',IntToStr(Random(100)),
            'BB',IntToStr(Random(100))
          ]
        )
      ));
    end;
    BackgroundWorker.WaitFor(INFINITE);
end;

begin
  Test;
end.

我正在使用最新的Otl主干(r1333)。我相信我在3.03a中也有同样的错误。

0 个答案:

没有答案