我在 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 的伟大作品,谢谢。
最佳答案
F2084 Internal Error: 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;
关于delphi - 将 TStringList 传递给 TOmniTask 过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25934630/