首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为每个线程自动初始化/取消全局初始化?

如何为每个线程自动初始化/取消全局初始化?
EN

Stack Overflow用户
提问于 2013-09-14 22:46:00
回答 2查看 525关注 0票数 3

我有一个带有initializationfinalization部分的单元。这个单元包含一个复杂的对象,它在initialization中实例化,在finalization中销毁。但是,此对象还包含ADO连接。这使它在跨线程使用时成为一个问题,因为ADO是COM,需要对每个线程进行初始化。

我现在就是这样处理这个全局对象实例的:

代码语言:javascript
复制
uses
  ActiveX;
...
initialization
  CoInitialize(nil);
  _MyObject:= TMyObject.Create;
finalization
  _MyObject.Free;
  CoUninitialize;
end.

这只适用于主线程。任何其他线程都无法访问它,并将返回一个异常CoInitialize has not been called

我如何绕过这件事来保证这个单位的线程安全?我需要一种方法来连接创建/销毁创建的任何线程,每个线程都需要引用该对象的不同实例。但如何才能做到呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-14 23:08:07

好吧,正如您自己已经说过的,每个线程都需要分别调用CoInitialize。此外,每个线程也需要有自己的ADOConnection

我认为您需要保留使用来自该单元的单个全局对象/连接的想法。只需在每个线程中重复创建和销毁对象即可。当线程类型不同时,就可以在它们之上设计一个基线程类。如果对象太大(与线程有关的开销)或不完全“适合”线程,则拆分对象设计。

现在,您的问题听起来只是想保持方便,但是如果确实有必要集中ADO连接参与,那么也许您可以为主线程和其他线程的连接事件实现多播事件。登录不应成为连续连接的问题:只需存储登录值并将它们提供给线程。

票数 8
EN

Stack Overflow用户

发布于 2013-09-15 07:46:59

虽然另一种设计可能是更好的解决方案,但您可以将_MyObject声明为threadvar,以便为每个线程拥有一个单独的实例。此外,您还可以将CoInitialize/CoUnitialize移动到TMyObject的构造函数/析构函数中。

我不能建议何时创建和释放这些实例,因为我不知道您的线程是如何创建和释放的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18807158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档