【发布时间】:2012-08-08 03:42:51
【问题描述】:
我试图让 TIdTCPServer 实例中的每个连接线程将 TADOConnection 实例化到上下文中。
这很好用,我将 CoInitialize(nil) 放在 OnConnect 事件处理程序中。问题是这个过程需要大约 20-25 秒才能工作,这太长了......
有什么建议吗?
干杯, 阿德里安
【问题讨论】:
我试图让 TIdTCPServer 实例中的每个连接线程将 TADOConnection 实例化到上下文中。
这很好用,我将 CoInitialize(nil) 放在 OnConnect 事件处理程序中。问题是这个过程需要大约 20-25 秒才能工作,这太长了......
有什么建议吗?
干杯, 阿德里安
【问题讨论】:
CoInitialize() 或 ADO 不太可能需要这么长时间来初始化。我已经使用多线程 COM 多年,从未经历过这样的延迟。
话虽如此,初始化 COM 的更好位置是在调用线程的 Execute() 方法的顶部,而不是在服务器的 OnConnect 事件中。要使用 Indy 实现这一点,请从 TIdThreadWithTask 派生一个新类并覆盖其 BeforeExecute() 和 AfterExecute() 方法。然后实例化一个TIdSchedulerOfThread... 组件,将您的类分配给它的ThreadClass 属性,并在激活服务器之前将它分配给服务器的Scheduler 属性。
【讨论】:
TADOConnection.Create() 需要 20 多秒才能运行?你是怎么计时的?您是否在使用分析器,例如 AQTime?你在计算 CPU 滴答声吗?你在使用性能计数器吗?