【问题标题】:Delphi thread best practicesDelphi 线程最佳实践
【发布时间】:2012-03-09 20:40:42
【问题描述】:

我正在我的应用程序中实现同步方法。它将执行的主要步骤是:

  • 从远程站点获取 XML 内容
  • 使用 IXMLDomDocument2 解析此 XML
  • 更新 Firebird 数据库

逻辑相当复杂,但它本身运行良好。

问题是当我尝试在单独的线程中运行它时。我很清楚,我的逻辑没有正确获得线程安全。

所以让我们切片吧

I - 使用 TidHTTP

获取内容

没有任何问题,我应该在这里有什么顾虑吗?

II - 对于 IXMLDomDocument2 我正在调用

CoInitializeEx(nil, 0);

根据the documentation 应该足以安全地使用IXMLDomDocument2。它似乎没问题,添加后我尝试使用它时没有收到任何错误。这里有什么额外的问题吗?

III - 安全使用 Firebird

我的问题在这里。有时有效,有时无效(我猜这是线程逻辑设计不当的主要症状)。大多数情况下,我都会收到 EInterbaseError 消息“从连接读取数据时出错”。其他时候它只是锁定。

我应该与数据库建立单独的连接吗?

【问题讨论】:

  • 绝对不应该在后台和前台线程之间共享到数据库的连接。
  • 我同意沃伦的观点。对于数据库,除非您知道给定的数据库引擎(及其 VCL 组件)是线程安全的,否则不要跨线程边界共享数据库组件。为每个线程提供自己的连接和自己的一组本地数据库组件。否则,将您的数据库逻辑移动到专用线程,其他线程可以在需要时向其发布请求。
  • 谢谢沃伦和雷米。我确实创建了一个单独的连接,现在一切正常。但我会保留我的问题,看看是否还有其他我应该担心的问题。

标签: multithreading delphi thread-safety delphi-7


【解决方案1】:

Warren 解决了共享后台线程和前台线程之间的连接的主要问题...您还有另一个问题,那就是对 CoInitialize 的每次调用都需要与 CoUninitialize 配对

http://msdn.microsoft.com/en-us/library/windows/desktop/ms688715(v=vs.85).aspx

【讨论】:

  • +1 为您的回答。我确实遇到了不调用 CoUninitialize 的问题。但是调用它并没有解决我的问题。在对我的线程进行一些调用后,是否调用它会导致同样的内存不足问题。我确定问题出在 coInitialize 上,因为如果关闭,我的程序根本不会获得足够的内存。
猜你喜欢
  • 2010-10-14
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多