Multithreading Delphi线程最佳实践

Multithreading Delphi线程最佳实践,multithreading,delphi,thread-safety,delphi-7,Multithreading,Delphi,Thread Safety,Delphi 7,我正在我的应用程序中实现一个同步方法。它将执行的主要步骤是: 从远程站点获取XML内容 使用IXMLDomDocument2分析此XML 更新Firebird数据库 逻辑相当复杂,但其本身运行良好 问题是当我试图在一个单独的线程中运行它时。我很清楚,我没有在逻辑中正确地获得线程安全性 所以让我们把它切成薄片 I-使用TidHTTP获取内容 没有任何问题,我在这里应该有什么顾虑吗 II-我正在打电话给IXMLDomDocument2 CoInitializeEx(nil, 0); 根据这一点

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

  • 从远程站点获取XML内容
  • 使用IXMLDomDocument2分析此XML
  • 更新Firebird数据库
逻辑相当复杂,但其本身运行良好

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

所以让我们把它切成薄片

I-使用TidHTTP获取内容

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

II-我正在打电话给IXMLDomDocument2

CoInitializeEx(nil, 0);
根据这一点,应足以安全使用IXMLDomDocument2。它似乎是好的,添加后,我没有得到任何错误时,试图使用它。有什么特别的担心吗

III-安全使用Firebird

我的问题就在这里。有时有效,有时无效(我想这是设计糟糕的线程逻辑的主要症状)。大多数情况下,我都会收到一个EInterbaseError,消息是“从连接读取数据时出错”。有时它只是简单地锁定


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

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


绝对不应该在后台线程和前台线程之间共享与DB的连接。我同意Warren的观点。对于数据库,除非您知道给定的DB引擎(及其VCL组件)是线程安全的,否则不要跨线程边界共享DB组件。为每个线程提供自己的连接和自己的loal DB组件集。否则,将您的DB逻辑移动到一个专用线程,其他线程可以在需要时向其发送请求。谢谢Warren和Remy。我确实创建了一个单独的连接,现在一切正常。但是我会保留我的问题,看看是否还有其他我应该关心的问题。我确实因为没有给你打电话而有问题。但打电话并没有解决我的问题。无论是否调用它,在对我的线程进行一些调用之后,都会导致相同的内存不足问题。我确信这是coInitialize的问题,因为去掉if可以使我的程序完全没有内存不足。