delphi - 将 TStringList 传递给 TOmniTask 过程

标签 delphi delphi-2007 tstringlist omnithreadlibrary

我在 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/

相关文章:

multithreading - 有用于 Delphi 和 Free Pascal 的多线程跨平台库吗?

delphi - 在 Delphi 中,我的 DLL 中是否必须分配函数的返回 pchar

delphi - Delphi 2007 错误 "Unable to rename unit.pas to __history\unit..."的解决方法

Delphi for 循环和 StringList 错误

delphi - CryptoAPI 返回 HMAC_SHA1 的错误结果

delphi - 在 Delphi 中,如何强制 tListView 始终显示选定的行,即使没有聚焦时也是如此。

sql-server - Delphi调用SQL Server存储过程速度慢

Delphi 2007 - "exceptions to ignore"列表的编程操作

delphi - TStringList.LoadFromFile Unicode

Delphi - 将文件读取到StringList,然后删除并写回文件