Delphi线程最佳实践

3
我正在我的应用程序中实施一种同步方法。它将执行的主要步骤如下:
- 从远程站点获取XML内容 - 使用IXMLDomDocument2解析此XML - 更新Firebird数据库
逻辑相当复杂,但本质上它正常运行。
问题在于我尝试在单独的线程中运行它时。对我来说很清楚,我的逻辑没有正确实现线程安全。
所以让我们分开看:
I - 使用TidHTTP获取内容
我没有遇到任何问题,在这里我应该有任何顾虑吗?
II - 对于IXMLDomDocument2,我正在调用
CoInitializeEx(nil, 0);

根据文档,这应该足以安全地使用IXMLDomDocument2。在添加后,当我尝试使用它时没有任何错误,似乎一切正常。还有其他需要注意的问题吗?

III - 安全使用Firebird

我的问题出现在这里。有时它可以工作,有时候不行(我猜这是线程逻辑设计不良的主要症状)。大部分时间我会收到一个EInterbaseError错误,其中包含“从连接中读取数据时出错”的消息。其他时候它只是锁定。

我应该使用一个单独的数据库连接吗?


10
绝对不应该共享DB连接在后台和前台线程之间。 - Warren P
3
我同意Warren的观点。当涉及到数据库时,除非你确切知道某个DB引擎(和它的VCL组件)是线程安全的,否则不要跨线程边界共享DB组件。给每个线程分配自己的连接和本地DB组件集。否则,将你的DB逻辑移动到专用线程,其他线程需要时可以向其发布请求。 - Remy Lebeau
2
谢谢Warren和Remy。我已经创建了一个单独的连接,现在一切都正常了。但我会保留我的问题,看看是否还有其他需要关注的地方。 - Ricardo Acras
1个回答

2

+1 for your answer. 我确实因为没有调用CoUninitialize而遇到了问题。但是调用它并没有解决我的问题。无论是否调用,都会在对线程进行一些调用后出现相同的内存不足问题。我确定问题出在coInitialize上,因为去掉它后,我的程序完全没有出现内存不足的情况。 - Ricardo Acras

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接