使用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- 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实现线程安全列表的更多相关文章
- 使用size()方法输出列表中的元素数量。需要注意的是,这个方法返回的值可能不是真实的,尤其当有线程在添加数据或者移除数据时,这个方法需要遍历整个列表来计算元素数量,而遍历过的数据可能已经改变。仅当没有任何线程修改列表时,才能保证返回的结果是准确的。
使用size()方法输出列表中的元素数量.需要注意的是,这个方法返回的值可能不是真实的,尤其当有线程在添加数据或者移除数据时,这个方法需要遍历整个列表来计算元素数量,而遍历过的数据可能已经改变.仅当没 ...
- 非阻塞式线程安全列表-ConcurrentLinkedDeque
一.ConcurrentLinkedDeque public class ConcurrentLinkedDeque<E> extends AbstractCollection<E& ...
- Python(八)进程、线程、协程篇
本章内容: 线程(线程锁.threading.Event.queue 队列.生产者消费者模型.自定义线程池) 进程(数据共享.进程池) 协程 线程 Threading用于提供线程相关的操作.线程是应用 ...
- CLR线程概览(一)
托管 vs. 原生线程 托管代码在“托管线程”上执行,(托管线程)与操作系统提供的原生线程不同.原生线程是在物理机器上执行的原生代码序列:而托管线程则是在CLR虚拟机上执行的虚拟线程. 正如JIT解释 ...
- Java线程:线程的同步与锁
一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. public ...
- python成长之路【第十一篇】:网络编程之线程threading模块
一.threading模块介绍 threading 模块建立在 _thread 模块之上.thread 模块以低级.原始的方式来处理和控制线程,而 threading 模块通过对 thread 进行二 ...
- 上下文管理、线程池、redis订阅和发布
一:上下文管理: 对于一些对象在使用之后,需要关闭操作的.比如说:socket.mysql数据库连接.文件句柄等. 都可以用上下文来管理. 语法结构: Typical usage: @contextm ...
- Java线程:概念与原理
Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...
- Python:线程
Python中创建线程有两种方式:函数或者用类来创建线程对象. 函数式:调用 _thread 模块中的start_new_thread()函数来产生新线程. 类:创建threading.Thread的 ...
随机推荐
- extract method
函数 简短,命名良好 函数名描述的是做什么 而不是怎么做 行数过高的代码中 将一大段做一个事的代码提取到独立的method 中 高层函数直接引用. 创建新函数 将提炼的代码平移到目标函数中 检查是否引 ...
- vue 简单实现父组件向子组件传值,简单来说就是子组件肆意妄为的调用父组件里后台返回的值
首先在于父子组件传值的方法很多,本人在这里只是简单描述一下一个组件里面引用了子组件,那么子组件如何才能获取父组件中后台返回的值呢? 首先调用组件相信大家都应该明白了(不明白的自己撸撸文档), < ...
- mysql修改当前用户的密码
ALTER USER USER() IDENTIFIED BY '123456';https://majing.io/posts/10000005531181
- 从ranknet到lamdarank,再到lamdamart
learn2rank目前基本两个分支,1是神经网络学派ranknet,lamdarank,另一个是决策树学派如gbrank,lamdamart 05年提出ranknet,算分模块是简单的全连接网络,l ...
- Azure中block和Page的比较 Azure: Did You Know? Block vs Page Blobs
Azure storage service supports two types of blobs (blob, or BLOB, stand for Binary Large OBject, i.e ...
- Robot Framework--ride使用说明2
RIDE创建项目 1.创建项目 1.1File->New Project 注:选择directory原因是,在directory的项目下可以创建测试套件,如果是tpye为file,则只能创建测试 ...
- MACE移植要求
MACE支持Tensorflow的depth_to_space和space_to_depth,以及strided_slice算子. 其中depth_to_space可以用来无平滑地进行上采样. spa ...
- liunx定时任务
为当前用户创建cron服务 1. 键入 crontab -e 编辑crontab服务文件 例如 文件内容如下: */2 * * * * /bin/sh /home/admin/jiaoben/bu ...
- idea函数被调用
打开一个复杂的程序或者项目进行分析的时候,我们就需要知道一个方法在哪里被调用,用于迅速厘清代码逻辑.操作如下:选中函数,右键,点击Find Usages. 如图: 操作简单,但右键还是没有快捷键方便. ...
- jieba库与词云的使用——以孙子兵法为例
1.打开cmd安装jieba库和 matplotlib. 2.打开python,输入代码.代码如下: from wordcloud import WordCloud import matplotlib ...