用C++实现事件
Implementing events in C++
在互联网上研究了一种在C++中实现事件的有效方法后,我发现了以下方法
- 接口类-应用程序可以覆盖派生类中的虚拟函数
- 使用函数指针的普通回调机制
- 使用Boost.函数的学员
- 信号和插槽(如Qt中所用)
我对每种方法的优点和缺点以及何时使用这些方法感到困惑。哪种方法是最好的,为什么?有没有其他解决方案比列出的更好?
FWIW,我随时都会投票支持Boost Signals。
Boost可确保便携性。当然,它与Boost Asio、Functional、Bind等很好地集成在一起。
更新:
信号2
本文档描述了原始Boost的线程安全变体。信号库。为了支持线程安全,对接口进行了一些更改,主要是在自动连接管理方面。[….]
Boost可确保便携性。当然,它与Boost Asio、Functional、Bind等很好地集成在一起。
boost::signals2::signalsig;
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;
}
您检查GBL库了吗?它拥有您可能需要(甚至可能更多)的所有设施,用于驱动设计。你可以用它构建(真实的)定时和非定时模型。它是纯C++,没有被宏污染。它还利用C++0x来提高性能。此外,如果您使用C++0x编译器,您可以获得充当事件处理程序的lambda函数——它非常强大。GBL支持同步和异步事件处理程序、线程和光纤。它通过信号和端口抽象事件流。通过一些独创性和精心设计,您可以使用异步事件处理程序,并显著提高多核/多处理器系统的性能。它还有一个图形设计器和跟踪器。
如果没有可视化,构建和维护事件驱动的应用程序可能会非常困难,设计师在这方面提供了很多帮助。调试事件驱动的应用程序也可能非常困难,因为您不再有顺序执行,而是执行从一个事件处理程序跳到另一个,因此使用事件跟踪程序会有很大帮助。
前两个选项是基本C++标准的一部分,函数回调也与C代码兼容。
另外两个选项需要分别使用boost和Qt。
优点/缺点是一个过于宽泛的问题,答案在很大程度上取决于你在做什么,在什么环境下,为了什么目的。
您可以使用Observer设计模式。下面是它的C++源代码示例。http://sourcemaking.com/design_patterns/observer/cpp/3
- C++上的手动重置事件(来自 C#)实现:如何避免争用条件
- 服务器端事件C++实现?
- 如何实现从 Windows 脚本主机到脚本的事件调度
- 如何实现由TPAINTBOX创建的新组件的OnMousedown,OnMouseUp事件
- 改进了 C++ 中计时器(超时事件)的实现
- 键按下事件错误 Qt 实现函数时
- 继承自定义选项卡栏和调整大小事件的实现
- 重新实现大小调整事件
- 尝试实现 Windows API 包装器的事件处理程序时遇到问题
- Windows事件在Linux中使用条件变量实现
- QTextEdit 实现一个 onlclick 事件
- 跨平台C++高精度事件定时器实现
- 如何用SDL1.2.15实现触摸事件
- 如何在 Windows 上仅使用事件和联锁原语实现递归锁
- C++:游戏引擎的事件系统实现
- 如何实现一个简单的事件队列
- 同步此事件实现的最佳方法是什么
- 如何在C++事件中实现remove处理程序
- C/C++ 中事件循环的实现在调用堆栈上很好
- 我能否仅使用事件、互斥体和信号量实现公平"wait on multiple events"?