gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:39:50 25 4
gpt4 key购买 nike

我有一个带有初始化终结部分的单元。该单元包含一个复杂的对象,该对象在初始化中实例化并在终结中销毁。但是,该对象还包含一个 ADO 连接。这使得跨线程使用它时出现问题,因为 ADO 是 COM,并且需要为每个线程进行初始化。

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

uses
ActiveX;
...
initialization
CoInitialize(nil);
_MyObject:= TMyObject.Create;
finalization
_MyObject.Free;
CoUninitialize;
end.

这只适用于主线程。任何其他线程都无法访问它,并将返回异常 CoInitialize 尚未调用

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

最佳答案

好吧,正如您自己所说,每个线程都需要单独调用CoInitialize。此外,每个线程也需要有自己的 ADOConnection

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

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

关于multithreading - 如何为每个线程自动全局初始化/取消初始化某些内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18807158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com