我有一個調用COM接口的各種API的線程。現在我想從另一個線程調用這些函數。你能告訴我如何才能做到這一點? 如何實現這兩個線程之間的通信?如果我定義了這兩個線程通用的消息隊列類型的數據結構,那麼如何定義一個公共數據結構,因爲每個COM API的參數都不相同。C++多線程數據結構,用於兩個線程之間的通信
在此先感謝
我有一個調用COM接口的各種API的線程。現在我想從另一個線程調用這些函數。你能告訴我如何才能做到這一點? 如何實現這兩個線程之間的通信?如果我定義了這兩個線程通用的消息隊列類型的數據結構,那麼如何定義一個公共數據結構,因爲每個COM API的參數都不相同。C++多線程數據結構,用於兩個線程之間的通信
在此先感謝
您沒有定義一個通用的數據結構。每個不同的函數簽名都有不同的數據結構。這些結構之間只有通用的東西是函數的標識符。在你的線程中,你會有巨大的開關(或std :: map),它會將函數標識符轉換爲函數本身。之後,你知道如何解釋結構的其餘部分。這些結構應該有POD語義。
典型的方法是使用回調。您通過指針傳遞數據。您可以使用多態性來重寫基類在將其從隊列中彈出時調用的方法。基地調用函數x,你可以重寫派生類中的函數x來實現你想要的。
另一種方法是使用普通的舊回調。將函數的地址和所需的任何數據一起傳遞到隊列中,並將其清理地包裝在結構中。所有回調都必須具有相同的簽名,因此您可能需要將您的數據轉換爲無效。
如果每個線程運行的single-threaded apartment那麼你可以通過CoMarshalInterThreadInterfaceInStream和CoGetInterfaceAndReleaseStream編組它的接口指針從對象的線程擁有對其他線程的IStream
就從遠程線程所需的API調用。一旦遠程線程有一個接口指針,你可以直接調用它。
根據您的應用程序的線程模型,您可能也可以更簡單地使用Global Interface Table來完成此操作。這將是最簡單的方法。
你需要提供更多的細節。爲什麼你需要一個消息隊列? COM調用通常是同步的。 – 2010-11-04 19:14:24