【问题标题】:In Delphi, is TDataSet thread safe?在 Delphi 中,TDataSet 线程安全吗?
【发布时间】:2010-09-09 20:37:10
【问题描述】:

我希望能够在它自己的线程中异步打开一个 TDataSet,以便主 VCL 线程可以继续运行直到完成,然后让主 VCL 线程从该 TDataSet 中读取。我做了一些实验,遇到了一些非常奇怪的情况,所以我想知道以前是否有人这样做过。

我见过一些示例应用程序,其中 TDataSet 在单独的线程中创建,它被打开,然后从中读取数据,但这一切都是在单独的线程中完成的。我想知道在另一个线程打开数据源之后从主 VCL 线程中读取 TDataSet 是否安全。

我正在 Delphi 7 中进行 Win32 编程,使用来自 DAC for MySQL 的 TmySQLQuery 作为我的 TDataSet 后代。

【问题讨论】:

    标签: multithreading delphi dataset


    【解决方案1】:

    如果您只想在其自己的线程中使用数据集,您可以使用同步与主线程通信以进行任何 VCL/UI 更新,就像与任何其他组件一样。
    或者,更好的是,您可以使用自己的消息系统实现主线程和工作线程之间的通信。

    在此处查看 Hallvard 的线程解决方案:
    http://hallvards.blogspot.com/2008/03/tdm6-knitting-your-own-threads.html

    或另一个:
    http://dn.codegear.com/article/22411

    关于同步及其低效率的一些解释:
    http://www.eonclash.com/Tutorials/Multithreading/MartinHarvey1.1/Ch3.html

    【讨论】:

    • 我从 OmniThreadLibrary 的常见问题解答中注意到它仅支持 Delphi 2007 和 2009。有人在 D7 上使用过吗?
    【解决方案2】:

    我已经看到它与 TDataSet 的其他实现一起完成,即在 Asta 组件中。这些将联系服务器,立即返回,然后在数据加载后触发一个事件。

    但是,我相信这在很大程度上取决于组件。例如,除了主 VCL 线程之外,无法以同步方式打开这些相同的 Asta 组件。

    简而言之,我不认为这是 TDataSet 本身的限制,而是特定于实现的东西,我无权访问您提到的组件。

    【讨论】:

      【解决方案3】:

      要记住在多个线程之间使用相同的TDataSet 时,您只能在任何给定时间读取当前记录。因此,如果您在一个线程中读取记录,然后另一个线程调用 Next,那么您就有麻烦了。

      【讨论】:

        【解决方案4】:

        还要记住线程很可能需要自己的数据库连接。我相信这里需要的是一个多线程“保存”对象,用于将数据从线程加载到(只写),然后从主 VCL 线程只读。在阅读之前使用某种同步方法来确保您不会在同一时刻阅读您的写作,或者在同一时刻阅读您的阅读,或者将所有内容加载到内存文件中并编写一个同步方法来告诉主应用程序在文件中的位置停止阅读。

        根据预期记录的数量(以及数据集的大小),我曾多次采用最后一种方法,我什至将其保存到本地系统上的物理磁盘文件中。效果很好。

        【讨论】:

          【解决方案5】:

          我做过多线程数据访问,并不简单:

          1) 您需要为每个线程创建一个会话。

          2) 对该 TDataSet 实例所做的一切都必须在创建它的线程的上下文中完成。如果你想放置例如,这并不容易。上面有一个 db 网格。

          3) 如果你想让例如主线程处理您的数据,直接的解决方案是将其移动到某种单独的容器中,例如内存数据集。

          4) 一旦数据检索完成,您需要某种信号机制来通知主线程。

          ...异常处理也不简单...

          但是:一旦你成功了,应用程序将非常优雅!

          【讨论】:

            【解决方案6】:

            大多数 TDataset 不是线程安全的。我知道线程安全的是kbmMemtable。它还具有克隆数据集的能力,因此确实会发生移动记录指针的问题(如 Jim McKeeth 所解释的)。它们是您可以获得(购买或免费)的最佳数据集之一。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-10-14
              • 2015-02-15
              • 2010-11-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多