WEB开发网
开发学院软件开发VC 来自 COM 经验的八个教训 阅读

来自 COM 经验的八个教训

 2006-07-22 22:53:22 来源:WEB开发网   
核心提示: 检查他们的代码后发现,他们违反了 COM 并发的一个基本规则,来自 COM 经验的八个教训(3),就是说,如果一个线程要与另一个线程共享一个接口指针,您通常要使用一个事件或其他同步化基元来协调这两个线程的行为 — 例如,让线程 B 知道接口指针已准备好,它应首先封送该接口指针,

检查他们的代码后发现,他们违反了 COM 并发的一个基本规则,就是说,如果一个线程要与另一个线程共享一个接口指针,它应首先封送该接口指针。如果有必要,封送接口指针可使 COM 创建一个新的代理(以及一个新的信道对象,将代理和存根结对),以允许从另一个单元向外调用。不通过封送而将原始接口指针(内存中的一个 32 位地址)传递给另一个线程,会绕过 COM 的并发机制,并且如果发送和接收的线程位于不同的单元中,将出现各种不良行为。(在 Windows 2000 中,由于两个对象可以共享一个单元,但又位于不同的上下文中,因此如果线程位于同一个单元中,可能会使您陷入困境。)典型的症状包括调用失败和返回 RPC_E_WRONG_THREAD_ERROR。

Windows NT 4.0 和更高版本可以使用一对名为 CoMarshalInterThreadInterfaceInStream 和 CoGetInterfaceAndReleaseStream 的 API 函数,在线程之间轻松地封送接口指针。假定您应用程序中的一个线程(线程 A)创建了一个 COM 对象,继而接收了一个 IFoo 接口指针,并且同一进程中的另一个线程(线程 B)想调用这个对象。在准备将接口指针传递给线程 B 时,线程 A 应该封送该接口指针,如下所示:

CoMarshalInterThreadInterfaceInStream (IID_IFoo, pFoo, &pStream);

在 CoMarshalInterThreadInterfaceInStream 返回后,线程 B 就可以安全地取消封送该接口指针:

IFoo* pFoo;
CoGetInterfaceAndReleaseStream (pStream, IID_IFoo, (void**) &pFoo);

在这些示例中,pFoo 是一个 IFoo 接口指针,pStream 是一个 IStream 接口指针。COM 在调用 CoMarshalInterThreadInterfaceInStream 时初始化 IStream 接口指针,然后在 CoGetInterfaceAndReleaseStream 内部使用和释放该接口指针。实际上,您通常要使用一个事件或其他同步化基元来协调这两个线程的行为 — 例如,让线程 B 知道接口指针已准备好,可以取消封送。

上一页  1 2 3 4 5 6 7 8  下一页

Tags:来自 COM 经验

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接