如何为每个线程自动初始化/取消初始化某些内容?

Jer*_*dge 3 delphi multithreading initialization ado delphi-xe2

我有一个单位有一个initializationfinalization部分.这个单元包含一个复杂的对象,它被实例化initialization并在其中被破坏finalization.但是,此对象还包含ADO连接.这使得在跨线程使用它时出现问题,因为ADO是COM,需要为每个线程初始化.

这就是我当前处理这个全局对象实例的方式:

uses
  ActiveX;
...
initialization
  CoInitialize(nil);
  _MyObject:= TMyObject.Create;
finalization
  _MyObject.Free;
  CoUninitialize;
end.
Run Code Online (Sandbox Code Playgroud)

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

如何解决这个问题,使这个单元具有线程安全性?我需要一种方法来挂钩创建的任何线程的每个创建/销毁,并且每个线程都需要引用该对象的不同实例.但是如何去做呢?

NGL*_*GLN 8

好吧,正如你已经说过的那样,每个线程都需要CoInitialize单独调用.此外,每个线程也需要有自己的ADOConnection.

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

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