假设多线程环境和具有一个特定过程的(适当同步的)类

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);

10-05 22:15