當你有一個進程外的COM服務器,並且你從這個服務器內的客戶機中的客戶機中的線程X調用一個函數時,那麼這個函數如何在COM服務器上執行?Out of Process COM服務器 - 函數調用和線程
在其當前執行的線程中,還是在其主線程上?
當你有一個進程外的COM服務器,並且你從這個服務器內的客戶機中的客戶機中的線程X調用一個函數時,那麼這個函數如何在COM服務器上執行?Out of Process COM服務器 - 函數調用和線程
在其當前執行的線程中,還是在其主線程上?
觀察到正常的COM公寓線程規則。如果對象是由STA單元中的客戶端創建的,則客戶端線程需要使用編組接口指針或獲取RPC_E_WRONG_THREAD。實際的方法調用將在其STA線程中的服務器上執行,它需要抽取一個消息循環才能工作。序列化執行,不需要鎖定。
如果它住在MTA公寓中,那麼方法調用將在任意RPC工作線程上執行。你需要採取通常的穿線預防措施。
線程不會從一個進程跳轉到另一個進程。
COM服務器內部,COM監聽傳入的方法調用,並有一個線程池(特定於此進程)來服務請求。
因此,comm服務器中的代碼必須由開發人員進行線程安全,還是已經由系統照顧? – 2010-05-28 12:17:16
這可以在您的COM服務器中配置:要麼讓COM序列化所有請求,要麼告訴COM您將處理多線程(例如鎖),並且請求不會被序列化。 – Timores 2010-05-29 15:40:32
參見Inter-Object Communication,Proxy和Stub。
客戶端總是在某個進程內對象中調用接口 方法。如果 的實際對象是本地或遠程的,則調用 代理對象, 然後調用實際對象的遠程過程 。
那麼實際執行什麼方法? 答案是,每當有一個 調用到一個進程外接口, 每個接口方法被一個代理對象實現 。代理對象總是一個進程內對象,代表被調用的對象執行 。 此代理對象知道 實際對象正在本地或 遠程服務器中運行。
代理對象在某些數據包中打包了 函數參數,並生成對本地或遠程對象的 RPC調用。 數據包由服務器在本地 或遠程計算機上的存根對象 或遠程計算機拾取,該遠程計算機將參數解包爲 ,並調用 該方法的實際實現。 當該函數返回時,存根 將任何out參數和 返回值打包並將其發送回 代理,該代理將其解包並將 返回給原始客戶端。
因此,客戶端和服務器總是互相對話 ,好像所有內容都是 。
嗯,問題是關於一個out-proc服務器,所以總是會發生封送。我認爲你的答案與進程內服務器更相關,儘管客戶端和服務器的線程配置需要相同以防止編組。 – Timores 2010-05-29 15:42:13