我希望能够在它自己的线程中异步打开一个TDataSet,这样主VCL线程就可以继续,直到它完成,然后让主VCL线程从那个TDataSet读取。我做了一些实验,遇到了一些非常奇怪的情况,所以我想知道以前是否有人这样做过。
我见过一些示例应用程序,其中TDataSet是在单独的线程中创建的,打开它,然后从它读取数据,但这一切都是在单独的线程中完成的。我想知道在另一个线程打开数据源之后,从主VCL线程读取TDataSet是否安全。
我正在用Delphi7进行Win32编程,使用来自DAC for MySQL的TmySQLQuery作为我的TDataSet后代。
发布于 2008-09-17 08:28:47
如果您只想在dataset自己的线程中使用dataset,则可以只使用synchronize与主线程通信,以便进行任何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
发布于 2008-09-17 00:10:24
我在TDataSet的其他实现中(即在Asta组件中)也看到过这种情况。它们将联系服务器,立即返回,然后在数据加载后触发一个事件。
但是,我相信这在很大程度上取决于组件。例如,除了主VCL线程之外,这些相同的Asta组件不能以同步方式打开。
因此,简而言之,我不认为这是TDataSet本身的限制,而是特定于实现的东西,并且我无法访问您提到的组件。
发布于 2008-09-17 01:22:56
关于在多个线程之间使用相同的TDataSet,需要记住的一件事是,您只能在任何给定时间读取当前记录。因此,如果您正在一个线程中读取记录,然后另一个线程调用Next,那么您就有麻烦了。
https://stackoverflow.com/questions/78475
复制相似问题