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