Delphi 将TStringList传递到TOmniTask过程
我在Delphi 2007应用程序中使用OmniThreadLibrary,该应用程序使用全局线程池来执行一些文件操作(我需要尝试并确保它们按特定顺序完成) 我有一个新创建的Ini文件的内容,该文件存储在TStringList中 然后我将TStringList传递给TOmniTask的一个实例Delphi 将TStringList传递到TOmniTask过程,delphi,delphi-2007,tstringlist,omnithreadlibrary,Delphi,Delphi 2007,Tstringlist,Omnithreadlibrary,我在Delphi 2007应用程序中使用OmniThreadLibrary,该应用程序使用全局线程池来执行一些文件操作(我需要尝试并确保它们按特定顺序完成) 我有一个新创建的Ini文件的内容,该文件存储在TStringList中 然后我将TStringList传递给TOmniTask的一个实例 class procedure saveIniFile(const iniFile: TStringList); var task : IOmniTaskControl;
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是关于:伟大的作品,谢谢你
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;
内部错误
是编译器中的一个bug,无论您做了什么都不应该发生。编译器显然弄糊涂了。如果执行myObject:=task.Param['iniFile'].AsObject
然后ini文件:=myObject作为TStringList
?@David Heffernan-非常感谢,我创建了一个临时TObject并读取TOmniValue.AsObject,然后将TObject类型转换为TStringList。您的表达式需要编译器创建一个临时本地TOmniValue,并管理其生存期(它在记录中管理了类型)。这可能是导致编译器消化不良的原因。事实上,您使用的方法是正确的,但编译器有问题。。。大卫的解决方案是正确的。升级到更现代的Delphi后,还可以执行task.Param['iniFile'].AsObject
。关于编译错误,我将检查发生了什么。我不再使用D2007了,这样的问题会慢慢出现。