【问题标题】:Implementing events in C++在 C++ 中实现事件
【发布时间】:2011-06-01 23:48:54
【问题描述】:

在互联网上研究了一种在 C++ 中实现事件的有效方法后,我发现了以下方法

  • 接口类 - 应用程序可以覆盖派生类中的虚函数
  • 使用函数指针的普通回调机制
  • 使用 Boost.function 的委托
  • 信号和槽(在 Qt 中使用)

我对这些中的每一个的优点和缺点以及何时使用其中的任何一个感到困惑。 哪种方法最好,为什么? 有没有比上面列出的更好的解决方案?

【问题讨论】:

  • 更具体地了解“事件”。
  • 我正在尝试构建某种 SDK 库。该库可以向应用程序发送事件。我了解拥有抽象类方法或回调是一对一的事件机制。但是委托或信号可以启用一对多事件。使用代表或信号的任何其他建议?

标签: c++ events


【解决方案1】:

FWIW,我会在任何一天投票给Boost Signals

Boost 确保可移植性。当然,它可以很好地与例如Boost Asio、Functional、Bind 等。

更新:

信号2

本文档描述了原始 Boost.Signals 库的线程安全变体。为了支持线程安全,接口发生了一些变化,主要是在自动连接管理方面。 [....]

Boost 确保可移植性。当然,它可以很好地与例如Boost Asio、Functional、Bind 等。

升压::信号2::信号信号;

sig.connect(&print_sum);
sig.connect(&print_product);
sig.connect(&print_difference);
sig.connect(&print_quotient);

sig(5., 3.);

该程序将打印出以下内容:

The sum is 8
The product is 15
The difference is 2
The quotient is 1.66667

示例操作:

void print_sum(float x, float y)
{
  std::cout << "The sum is " << x+y << std::endl;
}

void print_product(float x, float y)
{
  std::cout << "The product is " << x*y << std::endl;
}

void print_difference(float x, float y)
{
  std::cout << "The difference is " << x-y << std::endl;
}

void print_quotient(float x, float y)
{
  std::cout << "The quotient is " << x/y << std::endl;
}

【讨论】:

  • 为什么使用 Boost.Signals 而不是 Boost.Signals2
  • @ildjam: 不知道 :) 更新答案
  • @sehe:你看过libtscb吗?它的performance 特别有趣……
  • @ildjam:不,我很欣赏这个提示。这个周末的某个时候会看看那个:)
  • 没有boost库,因为我在嵌入式平台上运行程序。什么是替代品?
【解决方案2】:

你检查过GBL library吗?它具有您可能需要(甚至更多)进行均匀驱动设计的所有设施。您可以使用它构建(实时)定时和非定时模型。它是纯 C++,没有被宏污染。它还利用 C++0x 来提高性能。此外,如果你使用 C++0x 编译器,你会得到 lambda 函数作为事件处理程序——它非常强大。 GBL 支持同步和异步事件处理程序、线程和纤程。它通过信号和端口抽象事件流。通过一些独创性和精心设计,您可以使用异步事件处理程序并显着提高多核/多处理器系统的性能。它还有一个图形设计器和跟踪器。

如果没有可视化,构建和维护事件驱动的应用程序可能会非常困难,设计师在这方面提供了很多帮助。调试事件驱动的应用程序也可能非常困难,因为您不再需要顺序执行,而是执行从一个事件处理程序跳转到另一个事件处理程序,因此拥有事件跟踪器会有很大帮助。

【讨论】:

    【解决方案3】:

    前两个选项是基本 C++ 标准的一部分,函数回调也与 C 代码兼容。

    另外两个选项需要分别使用 boost 和 Qt。

    优点/缺点是一个过于宽泛的问题,答案很大程度上取决于您在做什么、在什么环境中以及出于什么目的。

    【讨论】:

      【解决方案4】:

      您可以使用观察者设计模式。这是它的示例 C++ 源代码。 http://sourcemaking.com/design_patterns/observer/cpp/3

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-24
        • 2011-07-09
        • 2018-12-16
        • 1970-01-01
        • 1970-01-01
        • 2016-12-24
        相关资源
        最近更新 更多