2

我在 Delphi 2007 应用程序中使用 OmniThreadLibrary,该应用程序利用全局线程池来执行一些文件操作(我需要尝试并确保它们按特定顺序完成)。

我有一个新创建的 Ini 文件的内容,该文件存储在 TStringList 中。

然后我将 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 回答