使用TkbmMWThreadList实现线程安全列表

Posted kinglandsoft

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用TkbmMWThreadList实现线程安全列表相关的知识,希望对你有一定的参考价值。

2008年的2.90.00版本,作者实现了TkbmMWThreadList,之后在kbmMW 4.40.00版本,作者将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对象了!

 

以上是关于使用TkbmMWThreadList实现线程安全列表的主要内容,如果未能解决你的问题,请参考以下文章

源码阅读(31):Java中线程安全的QueueDeque结构——ArrayBlockingQueue

源码阅读(31):Java中线程安全的QueueDeque结构——ArrayBlockingQueue

如何确保Java线程安全?

Java线程实现与安全

线程学习--queue

编程实践用 go 语言实现线程安全的 hashmap