multithreading - Delphi线程最佳实践

标签 multithreading delphi thread-safety delphi-7

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

  • 从远程站点获取 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/

相关文章:

delphi - 随机 Indy 响应代码 = -1/EIdSocketError 套接字错误 # 0 异常

windows - 阻止 WM_DEVICECHANGE 调度

delphi - 哪个是初始化代码的最佳位置?

c# - 我该如何处理 "CrossThreadMessagingException"?

Java 在已启动的线程上运行更多代码

c++ - 我是线程的新手,这个编译错误是什么意思?

c++ - 在 C++ 中缓存昂贵的数据——函数范围的静态变量与可变成员变量

c# - DbContext 线程安全吗?

c - 带链表的多线程

c#删除元素后的Parallel For Loop索引异常