2012-08-08 72 views
0

我想在TIdTCPServer實例中獲取每個連接線程來將TADOConnection實例化到上下文中。Delphi(Indy + ADO)CoInitialize Slow

這工作正常,我將CoInitialize(nil)放置在OnConnect事件處理程序中。問題是這個過程需要大約20-25秒才能工作,這是很長的路...

有什麼建議嗎?

乾杯, 阿德里安

回答

3

這是非常不可能的,要麼CoInitialize()或ADO需要那麼長時間來初始化。多年來我一直在使用多線程COM,從未遇到過這樣的延遲。

也就是說,初始化COM的更好的地方是在調用線程的Execute()方法的頂部,而不是在服務器的OnConnect事件中。要用Indy做到這一點,請從TIdThreadWithTask中派生出一個新類並覆蓋其BeforeExecute()AfterExecute()方法。然後實例化一個TIdSchedulerOfThread...組件,將其類別分配給它的ThreadClass屬性,並在激活服務器之前將其分配給服務器的Scheduler屬性。

+0

非常感謝,你是對的,我誤診了罪魁禍首。它是這一行: TC2CContextdata(AContext.Data).ADOConnector:= TADOConnection.Create(nil); 其中左側是TIdContext類型轉換。爲什麼這會很慢? – Adrian 2012-08-08 04:20:58

+0

你是如何計算代碼的? – 2012-08-08 04:25:40

+0

所有這些都在服務器的OnConnect事件上。 – Adrian 2012-08-08 04:26:01