首页 / 知识
关于多线程:在Delphi中,TDataSet线程安全吗?
2023-04-16 07:16:00

In Delphi, is TDataSet thread safe?我希望能够在自己的线程中异步打开TDataSet,以便主VCL线程可以继续进行直到完成,然后再从该TDataSet中读取主VCL线程。 我已经做了一些试验,并陷入了一些非常奇怪的情况,所以我想知道以前是否有人这样做过。 我看过一些示例应用程序,其中在单独的线程中创建了TDataSet,将其打开,然后从中读取数据,但这都是在单独的线程中完成的。 我想知道在另一个线程打开数据源之后从VCL主线程读取TDataSet是否安全。 我正在Delphi 7中进行Win32编程,使用来自DAC for MySQL的TmySQLQuery作为我的TDataSet后代。
如果您只想在自己的线程中使用数据集,则可以使用sync与任何其他组件的VCL / UI更新主线程进行通信。
在此处检查Hallvard的线程解决方案:
或另外一个:
有关同步及其效率低下的一些说明: 在多个线程之间使用同一TDataSet时要记住的一件事是,您只能在任何给定时间读取当前记录。因此,如果您正在一个线程中读取记录,然后另一个线程调用Next,那么您将遇到麻烦。 我已经看到它是通过TDataSet的其他实现完成的,即在Asta组件中。这些将联系服务器,立即返回,然后在加载数据后触发事件。 但是,我认为这在很大程度上取决于组件。例如,除了主VCL线程外,无法以同步方式打开那些相同的Asta组件。 简而言之,我不认为这本身就是对TDataSet的限制,而是某些特定于实现的东西,而且我无权访问您提到的组件。 还要记住,线程很可能需要自己的数据库连接。我相信这里需要的是一个多线程"保持"对象,用于将线程中的数据加载到(只写)中,然后再从主VCL线程中读取该对象。在阅读之前,请使用某种同步方法来确保您不会在写作的同时阅读,或在阅读的同时阅读,或者将所有内容加载到内存文件中并编写同步方法来告知主应用程序文件在何处停止阅读。 我已经采用了最后一种方法,这取决于预期的记录数(以及数据集的大小),我甚至已经将其用于本地系统上的物理磁盘文件。效果很好。 我已经完成了多线程数据访问,这并不简单: 1)您需要为每个线程创建一个会话。 2)必须在创建该TDataSet实例的线程的上下文中完成对该TDataSet实例的所有操作。如果您想放置例如在其顶部的数据库网格。 3)如果您想让主线程处理您的数据,直接的解决方案是将其移动到某种单独的容器中,例如内存数据集。 4)一旦数据检索完成,您需要某种信令机制来通知主线程。 ...而且异常处理也不是直接的... 但是:成功之后,该应用程序将非常优雅! 大多数TDataset都不是线程安全的。我知道线程安全的一种是kbmMemtable。它还具有克隆数据集的能力,从而确实发生了移动记录指针的问题(如Jim McKeeth所述)。它们是您可以获得(购买或免费)的最佳数据集之一。 |
最新内容
相关内容
linux读取命令行参数?
linux读取命令行参数?,系统,信息,数据,名称,软件,位置,标准,灵活,百度,资料,Linux命令行操作之sedsed命令行格式为:sed [-nefri] ‘command’linux线程查询命令?
linux线程查询命令?,系统,第一,线程,命令,软件,名称,信息,进程,选项,方法,Linux系统如何查看进程的线程数1、第一种方法:top命令法首先执行toplinux线程查询命令?
linux线程查询命令?,系统,第一,线程,命令,软件,名称,信息,进程,选项,方法,Linux系统如何查看进程的线程数1、第一种方法:top命令法首先执行toplinux命令读取前十个?
linux命令读取前十个?,时间,系统,最新,文件,名称,标准,密码,工作,适当,信息,linux写脚本,需要ls只显示前10个文件,怎么实现?在linux中如果用lslinux读取码值命令?
linux读取码值命令?,系统,工作,地址,证书,命令,工具,档案,文件,设计,信息,基本linux命令1、linux系统常用操作命令如下:ls:全拼list,功能是列出目linux多线程下载命令?
linux多线程下载命令?,软件,工具,平台,中心,系统,代理,网络,网站,手机,官方网站,从linux服务器中下载或上传文件wget是linux下一个从网络上自linux断开线程命令?
linux断开线程命令?,系统,状态,工作,代码,线程,入口,网络,管理,名称,命令,linux下C中怎么让才能安全关闭线程方法:在线程入口函数中,调用returnlinux停止线程的命令?
linux停止线程的命令?,系统,软件,代码,产品,进程,第一,管理,生产,通信,工具,linux下nginx停止命令1、首先,连接相应linux主机,进入到linux命令行linux超线程查看命令?
linux超线程查看命令?,系统,第一,信息,软件,命令,数据,工具,实时,界面,个数,Linux查看CPU详细信息这里我先介绍一个文件。它就是/proc目录文件linux查看多线程命令?
linux查看多线程命令?,系统,第一,线程,地址,数据,进程,命令,名称,软件,情况,如何查看linux服务器的cpu数量,内核数,和cpu线程数如何查看linuxlinux执行线程命令?
linux执行线程命令?,系统,工作,线程,软件,服务,管理,信息,环境,名称,命令,linux下线程属性常用操作有哪些1、linux系统常用操作命令linux系统linux线程操作命令?
linux线程操作命令?,系统,工作,时间,代码,线程,信息,第一,命令,函数,操作,linux下线程属性常用操作有哪些linux系统常用操作命令linux系统常用