为啥不推荐使用本机 Visual C++ 中的事件处理?

Posted

技术标签:

【中文标题】为啥不推荐使用本机 Visual C++ 中的事件处理?【英文标题】:Why is event handling in native Visual C++ deprecated?为什么不推荐使用本机 Visual C++ 中的事件处理? 【发布时间】:2010-02-19 10:42:10 【问题描述】:

http://msdn.microsoft.com/en-us/library/ee2k0a7d.aspx

事件处理也支持 本机 C++ 类(C++ 类 不实现 COM 对象), 但是,已弃用该支持 并将在未来被移除 释放

有人知道为什么吗?找不到此声明的任何解释。

【问题讨论】:

最新版本还声明它已被弃用,但它仍然存在,8 年后docs.microsoft.com/en-us/cpp/cpp/event-handling 【参考方案1】:

    这完全是非标准的组合,可能几乎没有实际 用户。我的意思是即使在 WinNT 和 Microsoft 私有世界中的非标准组合。

    COM 具有更丰富的类事件机制,并且还允许 这些天完全多线程的代码

    这个是致命的 - 功能正在做隐式锁定(可能是我们爷爷的想法 模板之前的“同步”和普通关键部分的广泛安全使用)。那 使它比 COM 的单间公寓更危险,咳咳,这件事 :-) 因为它可以让你突然陷入僵局(Java 的同步方法也发生过 - 没什么特别的 :-)

    如今,每个人和他们的狗都知道如何使用普通的多线程,并且至少知道如何使用带有智能指针的临界区,所以除了危险之外,这件事也无关紧要。

【讨论】:

+1,虽然我不同意“不相关” - 欢迎使用本机机制。它可以通过库来实现,但欢迎使用优雅的语法、良好的编译器诊断、调试支持(“即使触发时中断”)等提供一流的支持。 这实际上只不过是您不检查完成的异步调用。忘记 API 的名称 - 只是启动一个线程,该线程在函数返回时关闭 - 如果您知道自己在做什么,则完全可调试且无锁定。【参考方案2】:

我冒险猜测一下,类似的功能可以通过信号/插槽类型库以更便携/标准 C++(带模板)的方式实现,而不需要 MS 的编译器支持。

【讨论】:

更有可能查看 MSDN 页面,因为 MS 期望您在 COM 中执行事件和编组【参考方案3】:

我敢猜测他们现在会希望你以 .Net 的方式来做这件事。

【讨论】:

哈哈 +1,我认为 NET 和类似的托管代码是编程历史上发生的最大灾难。【参考方案4】:

看看Boost::Signals2

(这是Boost Signals的继承者,不再维护)

【讨论】:

仅供参考,此链接现已损坏。 boost 信号和 sigc++ 都是最好的选择。

以上是关于为啥不推荐使用本机 Visual C++ 中的事件处理?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C++ 中的 Visual Studio 不如 C# 中的智能? [关闭]

C++ 中的 Visual Studio MFC:为啥“int”有效但“double”无效?

为啥列表框不使用 Visual C++ 6 显示元素?

为啥我们在 Visual Studio 2013 中引用 C++ 项目?

为啥visual c++打开之后就自动关闭了?

如何在 Visual C++ 2008 中查找未使用的属性/方法