2

グローバルスレッドプールを利用していくつかのファイル操作を実行するDelphi 2007アプリでOmniThreadLibraryを使用しています(特定の順序で実行されることを確認する必要があります)。

TStringList に格納されている、新しく作成された Ini ファイルの内容があります。

次に、TStringList を TOmniTask のインスタンスに渡します。

class procedure saveIniFile(const iniFile: TStringList);
    var
        task  : IOmniTaskControl;
    begin
        task := CreateTask(saveIniFileTask, 'saveIniFile')
                   .SetParameter('iniFile', iniFile)
                   .Unobserved
                   .Schedule;
    end;

TOmniTask インスタンスで TStringList を取得する方法がわかりません

class procedure saveIniFileTask(const task: IOmniTask);
    var
        iniFile: TStringList;
    begin
        iniFile := task.Param['iniFile'];
    end;

上記はエラーを返します。

Incompatible types: 'TStringList' and 'TOmniValue'

私は型キャストを試みました:

iniFile:= TStringList(task.Param['iniFile'].AsObject);

しかし、コンパイルエラーが発生します:

F2084 Internal Error: C4310

OmniThreadLibrary バージョン 3.0 を使用しています - D2007 で 3.03b をコンパイルできません

@gabr について: OmniThreadLibray の素晴らしい作品、ありがとう。

4

1 に答える 1

3

F2084 内部エラー: C4310

これは内部コンパイラ エラーです。それはコンパイラのバグです。あなたのコードは問題ありませんが、コンパイラは何らかの理由でギャグします。

回避策を探してください。配列プロパティの読み取りと単純なプロパティの読み取りとキャストを単一の式で組み合わせることで、コンパイラがびっくりすることを期待しています。コードに問題はありませんが、コンパイラは簡単に混乱することがあります。

試みるべき明らかなことは、コンパイラーにより単純な式を与えることです。たとえば、ローカル変数に格納してからキャストしてみてください。

var
  obj: TObject;
....
obj := task.Param['iniFile'].AsObject;
iniFile := TStringList(obj);

または、それが気に入らない場合は、さらに一歩進んでください。

var
  ov: TOmniValue;
  obj: TObject;
....
ov := task.Param['iniFile'];
obj := ov.AsObject;
iniFile := TStringList(obj);

または多分あなたは逃げることができます:

var
  ov: TOmniValue;
....
ov := task.Param['iniFile'];
iniFile := TStringList(ov.AsObject);

この流れで何かを機能させることができるはずです。

FWIW、ここでチェックキャストをお勧めします:

iniFile := ov.AsObject as TStringList;
于 2014-09-19T13:14:40.147 に答える