我正在我的应用程序中实现同步方法。它将执行的主要步骤是:
- 从远程站点获取 XML 内容
- 使用 IXMLDomDocument2 解析此 XML
- 更新 Firebird 数据库
逻辑相当复杂,但本身运行良好。
问题是当我尝试在单独的线程中运行它时。我很清楚,我的逻辑没有正确地实现线程安全。
所以我们来切片
I - 使用 TidHTTP 获取内容
没有任何问题,我应该有任何疑虑吗?
II - 对于 IXMLDomDocument2 我正在打电话
CoInitializeEx(nil, 0);
根据the documentation应该足以安全地使用IXMLDomDocument2。看起来没问题,添加后我在尝试使用它时没有收到任何错误。这里还有什么额外的问题吗?
III - 安全使用 Firebird
我的问题就在这里。有时它有效,有时则无效(我猜这是设计不良的线程逻辑的主要症状)。大多数时候,我会收到 EInterbaseError ,并显示消息“从连接读取数据时出错”。其他时候它只是锁定。
我应该与数据库建立单独的连接吗?
最佳答案
Warren 解决了共享后台和前台线程之间的连接的主要问题...您还有另一个问题,那就是对 CoInitialize 的每次调用都需要与 CoUninitialize 配对
http://msdn.microsoft.com/en-us/library/windows/desktop/ms688715(v=vs.85).aspx
关于multithreading - Delphi线程最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9640686/