通用锁定池,将通用添加到非通用tlist

时间:2010-10-08 09:36:33

标签: delphi generics delphi-2009

我尝试了一个通用类,并且在第二次尝试时我尝试制作一个通用锁定池。我几乎得到了它的工作 我偶然发现我想将一个通用类型的类放入从tthreadlist获得的锁定tlist中。

主要问题是:

  • 有人知道这个问题的解决方案吗? (参见来源中的“问题点”)

提示,小问题:

  • 我是否需要一个额外的约束信号参考? (我尝试添加,引用已存在的类和构造函数)
  • sb是否知道所有“特殊”泛型约束(类,构造函数)的良好概述页面。在手册中找不到多少。
  • 该公司在D2009,但我有一个许可DXE用于迁移准备目的。

这个池使用的对象是有用的,更糟糕​​的是,它们中的一些有一些必须内联的关键方法。 (这是一个图像处理应用程序,这也是为什么我不关心相对简单的锁。粒度很粗糙)。我提到这一点,因为它可能使基于接口的解决方案变得困难。

type
     TLockedPool<T:class,constructor>   =   class
                                  private
                                    lst : tthreadlist;
                                  public
                                    type sometype =t;  // part of workarounds.
                                    destructor  destroy;
                                    constructor create;
                                    function    getitem:T;
                                    procedure   putitem(var b:T);
                                   end;

 constructor TLockedPool<T>.create;
 begin
  lst:=TThreadlist.Create;
 end;

destructor TLockedPool<T>.destroy;
var i : integer;
    v: tlist;
begin
  v:=lst.locklist;
  for i:=0 to v.count-1 do
    Tobject(v[i]).Free;
  lst.unlocklist;
  v.clear;
  freeandnil(lst);
 inherited;
end;

function TLockedPool<T>.getitem: T;
var cnt:integer;
   v : tlist;
begin
  v:=lst.LockList;
  cnt:=v.Count;
  if cnt>0 then
    begin
      result:=tobject(v[cnt-1]);
      v.delete(cnt-1);
    end
  else
    begin
     result:=T.create;
    end;
  lst.UnlockList;
end;

procedure TLockedPool<T>.putitem(var b: T);
var  v : Tlist;
 x : sometype;
begin
if assigned(b) then // some older parts of the framework are dirty and try to put in NILs.
    begin
      v:=lst.LockList;
      x:=b;
      v.Add(pointer(sometype(x)));  // <--- the problemspot
      lst.unlocklist;
    end;
 b:=nil;
end;

1 个答案:

答案 0 :(得分:2)

使用v.Add(TObject(x))或者,如果必须(可能在2009年无法使用,我需要检查),v.Add(PPointer(@x)^)