2012-11-17 162 views
2

我有一個實現com服務器的Delphi7程序。由於一些新的數據庫查詢,最近完成程序初始化的時間有所增加。我的意思是程序啓動是程序能夠以有意義的方式處理傳入的COM調用所花費的時間。 我的問題是我如何處理傳入的COM調用程序尚未正確初始化。放棄呼叫中包含的信息不是一種選擇,呼叫需要等待程序初始化。 使用布爾初始化變量的簡單while循環是否足夠? 我問,因爲我讀過com調用在主VCL線程中執行,這會提示while循環會導致程序掛起(初始化也發生在VCL線程中)。Delphi7如何讓Com對象等到程序初始化完成?

互斥不能被用於WAITFOR同一線程內執行的代碼,是嗎?

換一種方式,做一個COM調用(COM服務器)VCL線程執行interupt,直到它完成或怎麼做的代碼相同的線程的工作中這種併發執行? 感謝您抽出時間。

+0

COM不介意等待。你爲什麼想幫忙?不要幫忙。 –

+0

但是如果一個com調用在vcl線程內執行並且初始化發生在VCL線程中,那麼不會有一個while循環阻塞該線程並導致initilisation不能完成? 當Windows啓動一個包含com服務器的delphi程序時,在com函數被調用之前執行哪些部分(初始化部分,窗體創建)?如果我知道,那麼我可以確保在初始化完成之前,com函數永遠不會執行。 – MCS

回答

1

移動數據庫的邏輯出了主線程,因此它不再被阻止。

+0

初始化依賴於在GUI上顯示信息。如果我將它移動到另一個線程,我將需要調用同步(我猜)或使用消息來避免訪問衝突,因爲VCL組件不是線程安全的(不是確切地說明了那個部分,而是它對於我如何理解VCL上班)。如果這個前提是正確的,那麼這些機制中哪一個都不會掛起程序,因爲VCL線程停留在com調用中? 嗯。或者我可以在這種情況下使用互斥體和waitfor ...? – MCS

+0

然後從您的UI中分離初始化。讓初始化將信息存儲在內存中並繼續前進,然後讓UI獲取該信息並在閒暇時顯示它。 –

0

COM服務器(EXE)等待Applcation.Run控制流程之前返回到COM客戶端,因此,所有形式和數據模塊應該初始化。

然而,當一個形式創建另一個OLE對象(在FORMCREATE即打開Word文檔()的事件處理程序),這可能中斷等待並立即返回控制給客戶端COM。

嘗試檢查Applcation.Run之前創建本地化的問題形式的所有初始化代碼。