首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >选择性临界区-有条件

选择性临界区-有条件
EN

Stack Overflow用户
提问于 2011-04-14 17:07:56
回答 2查看 321关注 0票数 0

因此,我需要将代码包装在一个临界区(或类似的)中,但我不想要像(fMemberTable,fStaffTable)这样的几个临界区那样的脏东西……

代码语言:javascript
运行
复制
begin
    if fDBTable = 'Member' then
        fMemberTable.Enter
    else if fDbTable = 'Staff' then
    ....

我们有8张桌子,所以会变得很乱,有什么办法吗?

TCricalSection(fMemberTable).Enter;或者是一种易于“扩展”和使用的方法?

围绕函数的一个关键部分没有意义,因为我不想阻碍其他表……

EN

Stack Overflow用户

发布于 2011-04-15 07:34:26

您可以使用关键部分列表,例如,在此单元中定义的My class:

代码语言:javascript
运行
复制
interface
uses Classes, SyncObjs;

type
  { TCriticalSectionList by jachguate }
  { http://jachguate.wordpress.com }
  TCriticalSectionList = class
  private
    FCSList: TThreadList;
    FNameList: TStringList;
    function GetByName(AName: string): TCriticalSection;
  public
    constructor Create();
    destructor Destroy(); override;
    property ByName[AName: string]: TCriticalSection read GetByName; default;
  end;

  function CSList: TCriticalSectionList;

implementation
uses SysUtils;

{ TCriticalSectionList }

constructor TCriticalSectionList.Create;
begin
  inherited;
  FCSList := TThreadList.Create;
  FNameList := TStringList.Create;
end;

destructor TCriticalSectionList.Destroy;
var
  I: Integer;
  AList: TList;
begin
  AList := FCSList.LockList;
  for I := AList.Count - 1 downto 0 do
    TCriticalSection(AList[I]).Free;
  FCSList.Free;
  FNameList.Free;
  inherited;
end;


function TCriticalSectionList.GetByName(AName: string): TCriticalSection;
var
  AList: TList;
  AIdx: Integer;
begin
  AList := FCSList.LockList;
  try
    AName := UpperCase(AName);
    AIdx := FNameList.IndexOf(AName);
    if AIdx < 0 then
    begin
      FNameList.Add(AName);
      Result := TCriticalSection.Create;
      AList.Add(Result);
    end
    else
      Result := AList[AIdx];
  finally
    FCSList.UnlockList;
  end;
end;

var
  _CSList: TCriticalSectionList;

function CSList: TCriticalSectionList;
begin
  if not Assigned(_CSList) then
    _CSList := TCriticalSectionList.Create;
  Result := _CSList;
end;

initialization
  _CSList := nil;
finalization
  _CSList.Free;
end.

这个类基本上定义了一个临界区列表,可以通过"name“访问。当您第一次请求特定名称的临界区时,系统会自动为您创建该临界区。您必须使用提供的CSList函数访问此类的单个实例。

当列表的实例被销毁时,所有的临界区都会被销毁,例如,默认实例在应用程序结束时被销毁。

你可以像下面这样写代码:

代码语言:javascript
运行
复制
begin
  CSList[fDBTable].Enter;
  try
    DoStuff;
  finally
    CSList[fDBTable].Leave;
  end;
end;

好好享受吧。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5660877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档