2

TOmniValue 配列に文字列がある場合、名前または明示的なインデックスで値にアクセスすると、アクセス違反が発生します。例については、次のコードを参照してください。何か間違ったことをしていますか、それとも Delphi または TOmniValue にエラーがありますか? インデックスによるアクセスの回避策を見つけましたが、名前によるアクセスはどうでしょうか。

更新: 簡単に再現できるように Test をコンソール アプリに移動しましたが、エラーはすべての反復ではなく、2 回ごとの実行でのみ発生します。それとも、今は同じエラーでさえないのでしょうか?

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 でも同じエラーが発生したと思います。

4

0 に答える 0