我在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,谢谢。
答案 0 :(得分: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;