COM事件处理的最快方式(就性能而言)
Fastest way (in performance terms) for COM events handling
我有一个带有dispinterface_QuoteEvents的COM Quote类。对于事件处理,我使用以下说明:
事件接收器类,派生自IDispEventSimpleImpl:
class CProxyQuoteEvents : public IDispEventSimpleImpl<SINK_ID, CProxyQuoteEvents, &__uuidof(_IQuoteEvents)> {
....
}
COM库初始化和对象创建及建议:
CProxyQuoteEvents g_quoteEventsProxy;
QuotePtr g_quote;
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
g_quote.CreateInstance(__uuidof(Quote));
g_quoteEventsProxy.DispEventAdvise(g_quote, &__uuidof(_IQuoteEvents));
所有这些构造对我来说都很好(事件按预期处理),但我想知道还有其他更快的解决方案吗?如果避免ATL会更快,也许我可以在没有ATL的情况下意识到这一点?
此外,请解释之间是否存在差异
class ATL_NO_VTABLE CSimple :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CSimple, &CLSID_Simple>,
public IDispatchImpl<ISwitch, &IID_ISwitch, &LIBID_DISPEVENTLib>,
public IDispEventSimpleImpl</*nID =*/ 1, CSimple, &__uuidof(Word::ApplicationEvents)>
和
class CSimple :
public IDispEventSimpleImpl</*nID =*/ 1, CSimple, &__uuidof(Word::ApplicationEvents)>
使用此代码片段调度事件最耗时的部分是使用IDispatch::Invoke
进行传递,并且它完全在COM服务器端(尤其是如果COM服务器位于不同的进程或单元中)。除非您知道该COM服务器提供了不同的事件调度方法,否则您几乎无能为力,而且它在延迟方面更好。
此外,请解释一下…之间是否存在差异。。。IDispEventSimpleImpl
没有区别。在这两种情况下都是IDispEventSimpleImpl
,并且它是接收调用的类。IDispEventSimpleImpl
(与许多其他ATL类不同)不需要在真正的COM对象类上实现它,任何类都可以。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 如何在c++中为模板函数实例创建快捷方式
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 在c代码之间共享数据的最佳方式
- 在C++中将函数压缩为两种方式
- 以螺旋方式打印矩阵的程序.(工作不好)
- 大小相等但成员数量不同的结构之间的性能差异
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 为什么constexpr的性能比正常表达式差
- 创建引用向量的优雅方式
- 以这种方式在运行时访问元组的性能成本
- 一维数组映射方式的性能差异问题
- 如何以编程方式访问c/c++a-la-rdtsc中的性能计数器
- 从文件中读取大量数据并以有效的方式解析日期.如何提高海量数据的性能
- 在 x 时间后结束循环的性能最低占用方式
- 如何以跨平台的方式在 C/C++ 中测试计算机的实际一般性能
- 以多态的方式处理非多态对象,不会产生性能开销
- COM事件处理的最快方式(就性能而言)
- 以与语言无关的方式检索性能计数器值