早在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- downto 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 := to lst.Count - do
begin
if lst.Items[i].Name = AConnectionName then
begin
Result := lst.Items[i];
Break;
end;
end;
finally
FConnectionList.EndRead;
end;
end;

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

使用TkbmMWThreadList实现线程安全列表的更多相关文章

  1. 使用size()方法输出列表中的元素数量。需要注意的是,这个方法返回的值可能不是真实的,尤其当有线程在添加数据或者移除数据时,这个方法需要遍历整个列表来计算元素数量,而遍历过的数据可能已经改变。仅当没有任何线程修改列表时,才能保证返回的结果是准确的。

    使用size()方法输出列表中的元素数量.需要注意的是,这个方法返回的值可能不是真实的,尤其当有线程在添加数据或者移除数据时,这个方法需要遍历整个列表来计算元素数量,而遍历过的数据可能已经改变.仅当没 ...

  2. 非阻塞式线程安全列表-ConcurrentLinkedDeque

    一.ConcurrentLinkedDeque public class ConcurrentLinkedDeque<E> extends AbstractCollection<E& ...

  3. Python(八)进程、线程、协程篇

    本章内容: 线程(线程锁.threading.Event.queue 队列.生产者消费者模型.自定义线程池) 进程(数据共享.进程池) 协程 线程 Threading用于提供线程相关的操作.线程是应用 ...

  4. CLR线程概览(一)

    托管 vs. 原生线程 托管代码在“托管线程”上执行,(托管线程)与操作系统提供的原生线程不同.原生线程是在物理机器上执行的原生代码序列:而托管线程则是在CLR虚拟机上执行的虚拟线程. 正如JIT解释 ...

  5. Java线程:线程的同步与锁

    一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. public ...

  6. python成长之路【第十一篇】:网络编程之线程threading模块

    一.threading模块介绍 threading 模块建立在 _thread 模块之上.thread 模块以低级.原始的方式来处理和控制线程,而 threading 模块通过对 thread 进行二 ...

  7. 上下文管理、线程池、redis订阅和发布

    一:上下文管理: 对于一些对象在使用之后,需要关闭操作的.比如说:socket.mysql数据库连接.文件句柄等. 都可以用上下文来管理. 语法结构: Typical usage: @contextm ...

  8. Java线程:概念与原理

    Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...

  9. Python:线程

    Python中创建线程有两种方式:函数或者用类来创建线程对象. 函数式:调用 _thread 模块中的start_new_thread()函数来产生新线程. 类:创建threading.Thread的 ...

随机推荐

  1. HBase Block Cache(块缓存)

    Block Cache HBase提供了两种不同的BlockCache实现,用于缓存从HDFS读出的数据.这两种分别为: 默认的,存在于堆内存的(on-heap)LruBlockCache 存在堆外内 ...

  2. 【Code Tools】Java微基准测试工具JMH之入门篇

    一.JMH是什么 JMH是一个Java工具,用于构建.运行和分析用Java和其他语言编写的以JVM为目标的 nano/micro/milli/macro 基准测试. 二.基本注意事项 1)运行JMH基 ...

  3. Lambd Expression

    “Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个 ...

  4. selenium、UA池、ip池、scrapy-redis的综合应用案例

    案例: 网易新闻的爬取: https://news.163.com/ 爬取的内容为一下4大板块中的新闻内容 爬取: 特点: 动态加载数据  ,用 selenium 爬虫 1. 创建项目 scrapy ...

  5. SWUST OJ(599)

    拉丁方阵 #include <iostream> #include <cstdlib> using namespace std; int main() { int n; cin ...

  6. LVM (逻辑卷管理器)

    图片来自:https://www.cnblogs.com/linuxprobe/p/5381538.html 参考博客:https://www.cnblogs.com/linuxprobe/p/538 ...

  7. Analysis servlet

    @WebServlet("/cdiservlet") public class NewServlet extends HttpServlet { private Message m ...

  8. ApiCloud开发的注意事项

    1. 引擎或模块问题:遇到应用层无法解决的问题,如果能确定需要引擎和模块支持的,不要自己想办法绕过去,要第一时间在开发者社区提交问题,或找APICloud项目经理提出. !!!注意!!!: 在开发者社 ...

  9. 【转】依赖注入的威力,.NET Core的魅力:解决MVC视图中的中文被html编码的问题

    有园友在博问中提了这样一个问题 —— .NET Core 中文等非英文文字html编码输出问题,到我们的 ASP.NET Core 项目中一看,也是同样的问题. 比如下面的Razor视图代码: @{ ...

  10. 算法:输出一个整数(不用ToString方法)

    1.递归实现 static void Main(string[] args) { Console.WriteLine("Pls input a number:"); int p = ...