{"id":1653,"date":"2015-01-01T06:50:08","date_gmt":"2014-12-31T22:50:08","guid":{"rendered":"http:\/\/blog.qdac.cc\/?p=1653"},"modified":"2015-01-01T07:00:43","modified_gmt":"2014-12-31T23:00:43","slug":"qsimplepool-%e4%b8%80%e4%b8%aa%e7%ae%80%e5%8d%95%e7%9a%84%e9%80%9a%e7%94%a8%e6%b1%a0%e5%af%b9%e8%b1%a1%e7%b1%bb%e5%ae%9e%e7%8e%b0","status":"publish","type":"post","link":"https:\/\/blog.qdac.cc\/?p=1653","title":{"rendered":"\u65b0\u5e74\u793c\u7269\uff1aQSimplePool &#8211; \u4e00\u4e2a\u7b80\u5355\u7684\u901a\u7528\u6c60\u5bf9\u8c61\u7c7b\u5b9e\u73b0"},"content":{"rendered":"<p>\u9996\u5148\uff0c\u606d\u795d\u5927\u5bb6\u65b0\u5e74\u5feb\u4e50\uff0c\u4e07\u4e8b\u5982\u610f\uff0c\u4e8b\u4e1a\u8fdb\u6b65\u30022014\u5df2\u7ecf\u8fc7\u53bb\uff0cQDAC \u9879\u76ee\u611f\u8c22\u6709\u4f60\u7684\u652f\u6301\u548c\u966a\u4f34\u3002<a href=\"https:\/\/blog.qdac.cc\/?p=1601\" target=\"_blank\">2014\uff0c\u611f\u8c22\u6709\u4f60\uff01<\/a><\/p>\n<p>\u4e3a\u5565\u53ebSimplePool\uff1f\u56e0\u4e3a\u5b83\u592a\u7b80\u5355\u4e86\uff0c\u4ee5\u81f3\u4e8e\u6ca1\u6709\u8db3\u591f\u7684\u6574\u4e2a\u4ee3\u7801\u52a0\u4e0a\u7cfb\u7edf\u81ea\u52a8\u751f\u6210\u7684\uff0c\u4e5f\u4e0d\u8fc7100\u591a\u884c\uff0c\u6240\u4ee5\u76f4\u63a5\u5728\u4e0b\u9762\u8d34\u51fa\u6e90\u7801\u5206\u4eab\u7ed9\u5927\u5bb6\uff1a<\/p>\n<pre class=\"lang:delphi decode:true \">unit QSimplePool;\r\n\r\ninterface\r\n\r\nuses classes, types, sysutils, syncobjs;\r\n\r\ntype\r\n  TQSimplePool = class;\r\n  TQSimplePoolItemNotify = procedure(ASender: TQSimplePool; AData: Pointer)\r\n    of object;\r\n  TQSimplePoolNewItemEvent = procedure(ASender: TQSimplePool;\r\n    var AData: Pointer) of object;\r\n\r\n  TQSimplePool = class\r\n  private\r\n    FOnFree: TQSimplePoolItemNotify;\r\n    FOnNewItem: TQSimplePoolNewItemEvent;\r\n    FOnReset: TQSimplePoolItemNotify;\r\n    FBeforePush: TQSimplePoolItemNotify;\r\n    FAfterPop: TQSimplePoolItemNotify;\r\n  protected\r\n    FPool: array of Pointer;\r\n    FCount: Integer;\r\n    FSize: Integer;\r\n    FDataSize: Integer;\r\n    FLocker: TCriticalSection;\r\n    procedure DoFree(AData: Pointer); \/\/ inline;\r\n    procedure DoReset(AData: Pointer); \/\/ inline;\r\n    procedure DoNew(var AData: Pointer); \/\/ inline;\r\n  public\r\n    constructor Create(AMaxSize, ADataSize: Integer); overload;\r\n    destructor Destroy; override;\r\n    procedure Push(p: Pointer);\r\n    function Pop: Pointer;\r\n    property Count: Integer read FCount;\r\n    property Size: Integer read FSize write FSize;\r\n    property OnNewItem: TQSimplePoolNewItemEvent read FOnNewItem\r\n      write FOnNewItem;\r\n    property OnFree: TQSimplePoolItemNotify read FOnFree write FOnFree;\r\n    property OnReset: TQSimplePoolItemNotify read FOnReset write FOnReset;\r\n    property BeforePush: TQSimplePoolItemNotify read FBeforePush\r\n      write FBeforePush;\r\n    property AfterPop: TQSimplePoolItemNotify read FAfterPop write FAfterPop;\r\n  end;\r\n\r\nimplementation\r\n\r\n{ TQSimplePool }\r\n\r\nconstructor TQSimplePool.Create(AMaxSize, ADataSize: Integer);\r\nbegin\r\ninherited Create;\r\nFSize := AMaxSize;\r\nFDataSize := ADataSize;\r\nSetLength(FPool, FSize);\r\nFLocker := TCriticalSection.Create;\r\nend;\r\n\r\ndestructor TQSimplePool.Destroy;\r\nvar\r\n  I: Integer;\r\nbegin\r\nFLocker.Enter;\r\nI := 0;\r\nwhile I &lt; FCount do\r\n  begin\r\n  DoFree(FPool[I]);\r\n  Inc(I);\r\n  end;\r\nFreeAndNil(FLocker);\r\ninherited;\r\nend;\r\n\r\nprocedure TQSimplePool.DoFree(AData: Pointer);\r\nbegin\r\nif Assigned(FOnFree) then\r\n  FOnFree(Self, AData)\r\nelse\r\n  FreeMem(AData);\r\nend;\r\n\r\nprocedure TQSimplePool.DoNew(var AData: Pointer);\r\nbegin\r\nif Assigned(FOnNewItem) then\r\n  FOnNewItem(Self, AData)\r\nelse\r\n  GetMem(AData, FDataSize);\r\nend;\r\n\r\nprocedure TQSimplePool.DoReset(AData: Pointer);\r\nbegin\r\nif Assigned(FOnReset) then\r\n  FOnReset(Self, AData)\r\nelse\r\n  FillChar(AData^, FDataSize, 0);\r\nend;\r\n\r\nfunction TQSimplePool.Pop: Pointer;\r\nbegin\r\nResult := nil;\r\nFLocker.Enter;\r\nif FCount &gt; 0 then\r\n  begin\r\n  Result := FPool[FCount - 1];\r\n  Dec(FCount);\r\n  end;\r\nFLocker.Leave;\r\nif Result = nil then\r\n  DoNew(Result);\r\nif Result &lt;&gt; nil then\r\n  begin\r\n  DoReset(Result);\r\n  if Assigned(FAfterPop) then\r\n    FAfterPop(Self,Result);\r\n  end;\r\nend;\r\n\r\nprocedure TQSimplePool.Push(p: Pointer);\r\nvar\r\n  ADoFree: Boolean;\r\nbegin\r\nif Assigned(FBeforePush) then\r\n  FBeforePush(Self, p);\r\nFLocker.Enter;\r\nADoFree := (FCount = FSize);\r\nif not ADoFree then\r\n  begin\r\n  FPool[FCount] := p;\r\n  Inc(FCount);\r\n  end;\r\nFLocker.Leave;\r\nif ADoFree then\r\n  DoFree(p);\r\nend;\r\n\r\nend.<\/pre>\n<p>\u5982\u679c\u5c06\u5b83\u5f53\u4f5c\u4e00\u4e2a\u5185\u5b58\u6c60\u4f7f\u7528\u65f6\uff0c\u53ef\u4ee5\u7b80\u5355\u5728\u6784\u9020\u51fd\u6570\u4e2d\u76f4\u63a5\u4f20\u9012\u5185\u5b58\u5757\u7684\u5927\u5c0f\u8fdb\u53bb\uff0c\u7136\u540e\u4e0d\u8981\u8bbe\u7f6eOnNewItem\u3001OnFree\u548cOnReset\u4e8b\u4ef6\u7684\u54cd\u5e94\u51fd\u6570\u5c31\u53ef\u4ee5\u4e86\u3002\u5982\u679c\u8981\u505a\u4e3a\u5bf9\u8c61\u6c60\uff0c\u5219\u9700\u8981\u81f3\u5c11\u54cd\u5e94\u8fd9\u4e09\u4e2a\u4e8b\u4ef6\uff0c\u4ee5\u6ee1\u8db3\u521b\u5efa\u5bf9\u8c61\u3001\u91ca\u653e\u5bf9\u8c61\u548c\u91cd\u7f6e\u5bf9\u8c61\u65f6\u7684\u9700\u8981\u3002<\/p>\n<p>\u4e00\u4e2a\u5f53\u505a\u5185\u5b58\u6c60\u7684\u7b80\u5355\u4f8b\u5b50\uff1a<\/p>\n<pre class=\"lang:delphi decode:true\">var \r\n  APool:TQSimplePool;\r\n...\r\nAPool := TQSimplePool.Create(1024, SizeOf(TOverlapped));\r\n...\r\n\/\/\u4ece\u6c60\u4e2d\u53d6\u51fa\u4e00\u4e2a\u5143\u7d20\r\nvar\r\n  ov:POverlapped;\r\n...\r\nov:=APool.Pop;\r\n...\r\n\/\/\u5c06\u5143\u7d20\u8fd8\u56de\u6c60\u4e2d\r\nAPool.Push(ov);\r\n<\/pre>\n<p>\u4e00\u4e2a\u5f53\u505a\u5bf9\u8c61\u6c60\u7684\u7b80\u5355\u4f8b\u5b50\uff1a<\/p>\n<pre class=\"lang:delphi decode:true \">var \r\n  APool:TQSimplePool;\r\n...\r\nAPool := TQSimplePool.Create(1024, 0);\r\nAPool.OnNewItem:=DoNewItem;\r\nAPool.OnReset:=DoResetItem;\r\nAPool.OnFree:=DoFreeItem;\r\n...\r\nprocedure TXXX.DoNewItem(ASender:TQSimplePool;var AData:Pointer);\r\nbegin\r\nAData:=TStringList.Create;\r\nend;\r\nprocedure TXXX.DoResetItem(ASender:TQSimplePool;AData:Pointer)\r\nbegin\r\nTStringList(AData).Clear;\r\nend;\r\nprocedure TXXX.DoFreeItem(ASender:TQSimplePool;AData:Pointer);\r\nbegin\r\nFreeObject(AData);\r\nend;\r\n...\r\n\/\/\u4ece\u6c60\u4e2d\u53d6\u51fa\u4e00\u4e2a\u5143\u7d20\r\nvar\r\n  AList:TStringList;\r\n...\r\nAList:=APool.Pop;\r\n...\r\n\/\/\u5c06\u5143\u7d20\u8fd8\u56de\u6c60\u4e2d\r\nAPool.Push(AList);<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u9996\u5148\uff0c\u606d\u795d\u5927\u5bb6\u65b0\u5e74\u5feb\u4e50\uff0c\u4e07\u4e8b\u5982\u610f\uff0c\u4e8b\u4e1a\u8fdb [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[69,8,21],"tags":[284,283,282],"class_list":["post-1653","post","type-post","status-publish","format-standard","hentry","category-c-builder","category-delphi","category-misc","tag-284","tag-283","tag-282"],"views":3828,"_links":{"self":[{"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=\/wp\/v2\/posts\/1653","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1653"}],"version-history":[{"count":4,"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=\/wp\/v2\/posts\/1653\/revisions"}],"predecessor-version":[{"id":1657,"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=\/wp\/v2\/posts\/1653\/revisions\/1657"}],"wp:attachment":[{"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1653"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1653"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1653"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}