zoukankan      html  css  js  c++  java
  • 使用TkbmMWThreadList实现线程安全列表

    早在2008年的2.90.00版本,作者就实现了TkbmMWThreadList,之后在kbmMW 4.40.00版本中,作者使用了Delphi的新特性,实现TkbmMWThreadList的泛型版本,用以实现线程安全的列表。要使用TkbmMWThreadList,首先要引用kbmMWGlobal单元。

    然后我们来看看,如何用TkbmMWThreadList实现自己的列表来管理对象。

    1.声明列表对象:

    FConnectionList:TkbmMWThreadList<TConnectionDataModule>;

    上面代码,用FConnectionList来管理TConnectionDataModule对象。

    2.建立FConnectionList实例:

    FConnectionList := TkbmMWThreadList<TConnectionDataModule>.Create;

    3.向对象列表填加被管理的对象:

    procedure TMainDatamodule.AddConnection(AConnectionDataModule: TConnectionDataModule);
    var
       lst:TList<TConnectionDataModule>;
    begin
         lst:=FConnectionList.BeginWrite;
         try
            lst.Add(AConnectionDataModule);
         finally
            FConnectionList.EndWrite;
         end;
    end;

    调用AddConnection方法,增加一个被管理的对象:

    ...
    AddConnection(cdm);
    ...

    4.清空列表对象:

    procedure TMainDatamodule.ClearAllConnection;
    var
       i:integer;
       lst:TList<TConnectionDataModule>;
    begin
         lst:=FConnectionList.BeginWrite;
         try
            for i:=lst.Count-1 downto 0 do
                lst.Items[i].Free;
            lst.Clear;
         finally
            FConnectionList.EndWrite;
         end;
    end;

    上面代码,清空列表对象中的所有被管理的对象。

    5.读取列表中的被管理的对象:

    function TMainDatamodule.GetConnectionPool(AConnectionName: string): TConnectionDataModule;
    var
      i: Integer;
      lst:TList<TConnectionDataModule>;
    begin
      Result := nil;
      lst:=FConnectionList.BeginRead;
      try
          for i := 0 to lst.Count - 1 do
          begin
            if lst.Items[i].Name = AConnectionName then
            begin
              Result := lst.Items[i];
              Break;
            end;
          end;
      finally
          FConnectionList.EndRead;
      end;
    end;

    基本实现方法,都写了,可以在线程中安全的使用FConnectionList对象,对TConnectionDataModule进行管理!

  • 相关阅读:
    微软软件下载
    FTP主动连接与被动连接
    Linux下grep显示前后几行信息
    cacti 安装过程中“ERROR: 您的MySQL TimeZone 数据库未被填充. 请在继续之前填入此数据库.”
    Cacti安装详细步骤
    Linux 踢掉其他终端用户
    迁移设备存储报的错误及解决方式
    sql_mode :(STRICT_TRANS_TABLES与STRICT_ALL_TABLES 区别)
    Nginx日志按日期切割详解(按天切割)
    git pull冲突:commit your changes or stash them before you can merge.
  • 原文地址:https://www.cnblogs.com/kinglandsoft/p/10790385.html
Copyright © 2011-2022 走看看