2010-08-11 66 views
2

我們在線程模型「Both」中給出了in-proc-server(.dll).i注意到了註冊表編輯器中的線程模型。我們知道com對象用「Both」創建的線程將採用創建對象的線程的線程模型。我實例化STA線程中的對象,以確保調用com對象應該只經過一個線程。我是以串行化方式從子線程調用此對象的方法,其中對象實際上是在主(STA)線程中創建的。它是否需要編組支持線程模型的COM對象「Both」

它會產生任何副作用嗎?

我沒有得到任何錯誤,並執行正常,當我在沒有任何編組(GIT)的子線程中使用該對象。

現在我的疑問是如何發生它。我沒有得到任何staright方式回答這個,當我谷歌。請給我一個簡要說明這個

根據我的理解,對象的編組是如果對象支持「STA」是需要嗎?這裏我們的對象支持「Both」。

+0

您真的在問爲什麼Google無法幫您找到答案嗎?奇怪的。 – 2010-08-11 17:13:19

+0

我不是說那個..我只是想知道我做的方式是正確的嗎?我對com編程非常陌生,因此我在此處發佈確認信息 – Sukumar 2010-08-12 05:38:31

回答

2

請參閱this very good explanation。是否使用編組將取決於對象和呼叫者是否在同一個房間中。如果我把你的話給對了,你可以打電話給CoInitializeEx()把一個線程放到STA中,然後你從這個線程調用CoCreateInstance() - 對象將在同一個STA中創建,所以原來的創建者線程將直接與它通信。另一個線程如何使用該對象將取決於公寓的配置。你的問題還不清楚,另一個線程調用CoInitializeEx()以及對象指針是如何傳遞給它的。如果你只是傳遞一個原始指針,那麼就沒有辦法打開編組。

當您將指針傳遞給另一個線程時,可能會遇到實際問題。 Part two of the above article你不應該通過公寓之間的原始指針。不過看起來你的情況是該規則的一個例外。 COM類被標記爲具有線程模型Both,所以它必須是完全線程安全的,因此可以從多個線程同時調用它的方法。我不確定這一點,但看起來你很安全。

+0

>是否使用編組將取決於對象和呼叫者是否在同一間公寓<<<<<< 在我們的使用CoinitializeEx(NULL,COINIT_APARTMENTTHREADED)在主線程中創建案例對象,並且使用對象方法將在沒有任何編組的情況下從子線程發生。子線程使用CoinitializeEx初始化(NULL,COINIT_MULTITHREADED),因此主線程的併發模型爲STA對於子線程是MTA。即使沒有初始化庫,我也能夠從子線程執行該方法。 – Sukumar 2010-08-12 06:22:45

+0

@Sukumar:如果你只是傳遞一個原始指針,編組就不會進入。你如何將對象指針傳遞給另一個線程? – sharptooth 2010-08-12 06:30:09

+0

我正在創建一個COM對象作爲類的成員並將此類實例傳遞給子線程。從子線程線程我將通過主類的實例訪問com對象 – Sukumar 2010-08-12 06:43:08

0

是的,因爲你正在一個房間中創建一個對象,並在另一個房間中調用方法。您尚未遇到任何副作用。我認爲是因爲你的對象很簡單(沒有回調,連接點等)。但它可能會改變。