2

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

procedure SortKeyList (KeyList : TList <Integer>; Inverted : Boolean);

它需要一个键列表并对其进行排序。该过程使用 RTL 快速排序实现 TList.Sort:

KeyList.Sort (TComparer <Integer>.Construct (CompareKeys))

现在解决问题:CompareKeys 必须访问该类的某些成员才能对列表进行排序(这就是该类的重点)。但是 RTL 要求 CompareKeys 是一个正常的函数。如何以线程安全的方式将数据从对象传递到 CompareKeys 函数?显然,使用全局交换变量不是一种选择,因为它绝不是线程安全的。

有什么想法吗?

4

2 回答 2

4

你传递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);
于 2009-04-01T12:56:39.267 回答
2

也许您可以使用threadvar(线程局部变量)来保存对您的实例的引用,然后可以从 CompareKeys 函数中访问该引用(在调用 Sort 之前分配 threadvar)。

于 2009-04-01T12:40:30.537 回答