假设多线程环境和具有一个特定过程的(适当同步的)类
procedure SortKeyList (KeyList : TList <Integer>; Inverted : Boolean);
它获取键列表并对其进行排序。该过程使用RTL快速排序实现TList.Sort:
KeyList.Sort (TComparer <Integer>.Construct (CompareKeys))
现在解决这个问题:CompareKeys必须访问该类的某些成员才能对列表进行排序(这是有关该类的重点)。但是RTL要求CompareKeys是常规函数。如何以线程安全的方式将数据从对象传递到CompareKeys函数?显然,使用全局交换变量不是一种选择,因为它绝对不是线程安全的。
有什么想法吗?
最佳答案
您将CompareKeys
传递给TComparer.Construct
的事实意味着CompareKeys
不一定是正常功能。 Delphi 2009引入了方法引用,可以引用普通的函数,方法和匿名方法。我假设TComparer.Construct
在您赋予它的普通函数中构造了一个方法引用。 (不过,我不确定为什么;我认为编译器会自动执行该转换。)
假设您有一个包含三个参数的函数,该函数接收一个列表和两个要比较的项目:
function CompareKeys(List: TList<Integer>; Item1, Item2: Integer): Integer;
您应该能够传递类似以下内容的匿名方法:
KeyList.Sort(function(Item1, Item2: Integer): Integer;
begin
Result := CompareKeys(KeyList, Item1, Item2);
end);