2010-11-04 107 views
0

我有一个调用COM接口的各种API的线程。现在我想从另一个线程调用这些函数。你能告诉我如何才能做到这一点? 如何实现这两个线程之间的通信?如果我定义了这两个线程通用的消息队列类型的数据结构,那么如何定义一个公共数据结构,因为每个COM API的参数都不相同。C++多线程数据结构,用于两个线程之间的通信

在此先感谢

+1

你需要提供更多的细节。为什么你需要一个消息队列? COM调用通常是同步的。 – 2010-11-04 19:14:24

回答

1

您没有定义一个通用的数据结构。每个不同的函数签名都有不同的数据结构。这些结构之间只有通用的东西是函数的标识符。在你的线程中,你会有巨大的开关(或std :: map),它会将函数标识符转换为函数本身。之后,你知道如何解释结构的其余部分。这些结构应该有POD语义。

2

典型的方法是使用回调。您通过指针传递数据。您可以使用多态性来重写基类在将其从队列中弹出时调用的方法。基地调用函数x,你可以重写派生类中的函数x来实现你想要的。

另一种方法是使用普通的旧回调。将函数的地址和所需的任何数据一起传递到队列中,并将其清理地包装在结构中。所有回调都必须具有相同的签名,因此您可能需要将您的数据转换为无效。

1

如果每个线程运行的single-threaded apartment那么你可以通过CoMarshalInterThreadInterfaceInStreamCoGetInterfaceAndReleaseStream编组它的接口指针从对象的线程拥有对其他线程的IStream就从远程线程所需的API调用。一旦远程线程有一个接口指针,你可以直接调用它。

根据您的应用程序的线程模型,您可能也可以更简单地使用Global Interface Table来完成此操作。这将是最简单的方法。