2012-03-09 100 views
3

我正在我的应用程序内实现同步方法。它将执行的主要步骤为:Delphi线程最佳实践

  • 从远程站点
  • 解析这个XML使用IXMLDomDocument2
  • 更新Firebird数据库

的逻辑是相当复杂的获取XML内容,但它本身工作正常。

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

所以let's切片它

我 - 获取使用TidHTTP

Didn't有任何问题,我应该有什么顾虑这里的内容吗?

II - 对于IXMLDomDocument2我打电话

CoInitializeEx(nil, 0); 

它根据the documentation应该足够使用IXMLDomDocument2安全。它似乎是好的,添加它后,我没有得到任何错误,当试图使用它。这里有什么额外的问题

III - 安全使用火鸟

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

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

+10

绝对不应该在后台和前台线程之间共享连接到数据库。 – 2012-03-09 21:02:53

+3

我同意沃伦。谈到数据库时,除非您知道给定的数据库引擎(及其VCL组件)是线程安全的,否则不要跨线程边界共享数据库组件。为每个线程分配自己的连接和自己的一组loal数据库组件。否则,将您的数据库逻辑移动到其他线程可以在需要时发布请求的专用线程。 – 2012-03-09 22:34:00

+2

谢谢沃伦和雷米。我确实创建了一个sepparate连接,现在没事了。但我会保留我的问题,看看我是否还有其他问题。 – 2012-03-09 23:18:35

回答

2

沃伦钉的主要问题与共享的背景和前景线程之间的连接......你有另外一个问题,那就是CoInitialize的每次调用需要与CoUninitialize配对

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

+0

+1您的回答。我确实没有调用CoUninitialize的问题。但称它没有解决我的问题。在对我的线程进行一些调用之后,调用它或不会导致相同的内存不足问题。我相信这是coInitialize的问题,因为如果关闭会导致我的程序没有得到足够的内存。 – 2012-03-27 13:11:54