我自己实现的Signal Slot库地址:http://gitorious.org/raylib/raylib/blobs/master/SignalSlot.hpp
C++中不同于.net和Java,并没有确定的“事件”的实现。就像.net的委托,Java的listener,都是比较好的实现。
早期的C++事件实现基于消息映射,或者消息循环。经常是一个消息,一大片switch,这样代码过于集中,而且没有一个像.net一样的事件发出者,并不怎么样。
当然,对于事件的实现,基本上有两大类,一种是“查表法”(消息映射,.net的事件,signal slot都属于这类)。另一种是虚函数法(VCL是吗?没用过;呵呵)。虚函数法的问题是,如果这个事件被处理的概率很小,那他内部消耗还是很大的(内存等)。
最近自己实现了一个Signal 和 Slot ,大家可以看看,对比一下,和消息映射有什么区别。
<code>#include <iostream>
#include “SignalSlot.hpp”
#include “SmartPtr.hpp”
#include <Windows.h>
usingnamespacestd;
class SignalTest
{
public:
SignalTest()
{
this->m_overflowSlot = OverFlowSignal.connect(this,&SignalTest::catchOverFlow);
this->m_overflowSlot.enable();
this->m_overflowSlot_const
= OverFlowSignal.connect(this,&SignalTest::catchOverFlowC);
this->m_overflowSlot_const.enable();
}
void increase()
{
static int i = 0;
++i;
if(i>20)
{
i = 0;
OverFlowSignal.emit();
}
}
void catchOverFlow()
{
cout<<”Catch Over Flow Member”<<endl;
}
void catchOverFlowC()const
{
cout<<”Catch Over Flow Const”<<endl;
}
RayLib::SignalV0 OverFlowSignal;
private:
RayLib::Slot m_overflowSlot;
RayLib::Slot m_overflowSlot_const;
};
void CatchOverFlowStatic()
{
cout<<”Catching Over Flow Static”<<endl;
}
int main()
{
SignalTest t1;
RayLib::Slot sl = t1.OverFlowSignal .connect(CatchOverFlowStatic);
sl.enable();
while(1)
{
t1.increase();
Sleep(100);
}
return 0;
}</code>
这里只是个测试。作为SignalTest类,他有可能发布一个signal(消息,事件,随便别的名字都行),叫OverFlowSignal。关注这个Signal的其他部分,都可以订阅他,也就是connect操作。。connect可以有静态的方法,也可以有类的成员方法。connect操作返回一个Slot(事件的响应者的句柄。。可以这么理解吧)。这个Slot可以disable,enable,destory。当Signal发出时,并且Slot也enable的情况下,会调用相应的处理函数。
当然,和.Net 一样,Signal是一对多的,一个Signal可以对应N个Slot。
这样就可以很有效的降低类之间的耦合。一个类如果想发出事件,只需要创建个Signal,然后再emit(发射)它,就行了。
另一个类如果关注这个时间,那就创建个Slot ,connect这个signal就行了。。
这样子,事件的发出方,和接收方可以达到互相不依赖的目的。
当然,最好是用Git都下来。编译。因为我这个SignalSlot还依赖于智能指针。呵呵。
呵呵,最近放假,想实现一些C++的基础类库,已经实现了智能指针,Signal 和Slot了。。
有兴趣一块写的可以回帖。
项目托管地址:http://gitorious.org/raylib
分享到:
相关推荐
"03_SignalAndSlot.ZIP"中的内容很可能是关于如何在主窗口(MainWindow)与子窗口(ChildWindow)之间利用信号和槽进行交互的实例教程。下面我们将深入探讨这一主题。 信号(Signal)是QT框架中的一种特殊函数,它...
本项目“signalandslot.rar”包含了作者在学习如何自定义信号和槽、处理信号与槽重载以及利用lambda表达式进行信号连接时编写的代码示例,非常适合初学者和进阶者学习QT编程的这一重要部分。 首先,让我们详细了解...
总之,“03_SignalAndSlot.rar”文件可能包含了关于Qt信号与槽机制的深入讲解,包括它们的工作原理、如何使用`connect`函数进行连接、不同类型的连接方式以及实际应用场景。通过学习这部分内容,开发者能够更好地...
在Java中实现Signal和Slot,我们首先需要定义一个Signal类,这个类会包含一个或多个表示不同事件的方法。每个方法可以代表一个Signal,参数类型和数量应与期望的Signal相匹配。然后,创建一个Slot接口,其中包含要...
在本项目"SignalAndSlot"中,我们将深入探讨Qt的信号槽机制以及如何在实际程序中运用。 信号(Signal)和槽(Slot)是Qt事件驱动模型的关键组成部分。信号表示一个事件的发生,而槽则定义了当信号被触发时应执行的...
本篇文章将深入探讨BlackBerry Datamodel的几个核心知识点,包括信号与槽(Signal and Slot)、排序数据模型(Sorted Data Models)、异步数据提供(Asynchronous Data Providing)以及未排序数据模型(Unsorted ...
6. **线程间的通信**:在生产者和消费者之间,可能还需要额外的信号和槽(signal and slot)来协调他们的操作,比如当缓冲区满时通知生产者停止生产,或者当缓冲区空时通知消费者暂停消费。 通过以上步骤,我们可以...
利用信号与槽(signal and slot)机制,程序中将按钮的clicked信号与QApplication的quit()槽连接,当按钮被点击时,会触发quit()方法来退出应用程序。 信号与槽机制是Qt中用于对象间通信的一种机制,是Qt编程的核心...
我们可以通过为QPushButton设置信号和槽(signal and slot)来响应用户的点击操作。 鼠标钩子函数,通常是指QApplication::installEventFilter(),用于捕获全局鼠标事件。在这个场景下,我们可以利用它来跟踪鼠标...
2. **多槽连接**:同一信号可以与多个槽关联,如`connect(Object1,SIGNAL(signal1),Object2,SLOT(slot1))`和`connect(Object1,SIGNAL(signal1),Object2,SLOT(slot2))`,意味着当`Object1`的`signal1`被触发时,`...
这些文件通常包含应用程序的主要逻辑,包括如何创建和管理按钮,以及处理按钮的信号和槽(signal and slot)机制。信号和槽是Qt中的一个核心特性,它使得对象之间的通信变得简单直接。 `main.cpp`是Qt应用程序的...
Qt 的 C++ API 设计优雅,提供了信号与槽机制(Signal and Slot),使得对象间通信变得简单直观,增强了代码的可读性和可维护性。 ### 5. 开源与商业版本 Qt 同时提供开源版本和商业版本。开源版本允许开发者在 ...
- **信号(Signal)与槽(Slot)机制详解** - **国际化(Internationalization)与本地化(Localization)的支持** - **多平台兼容性的处理技巧** #### Python与Qt结合的优势 Python作为一种高级编程语言,以其简洁易读的...
connect(resetButton, SIGNAL(clicked()), this, SLOT(initGame())); ``` #### 结论 基于Qt4的图形用户界面程序设计与实现充分展现了Qt框架的强大功能和灵活性。信号与槽机制以及事件处理机制的运用,不仅简化了...
在QT框架中,信号(Signal)与槽(Slot)机制是一种独特的对象间通信方式,它不仅为开发人员提供了更为灵活和安全的方法来构建交互式的GUI应用,而且也是QT区别于其他GUI库的重要特性之一。本文将详细介绍信号与槽的基本...
信号与槽(Signal and Slot)是Qt框架中用于对象间通信的关键机制,它替代了传统的回调函数,提供了更安全、更灵活的事件处理方式。在`Clock`类中,通过创建一个`QTimer`对象并将其与`update()`槽函数连接,实现了每...
除此之外,为了实现聊天功能,项目可能还涉及到了字符串处理(QString类)、信号与槽机制(signal and slot)以及序列化和反序列化技术。信号与槽机制是QT中一种事件驱动的编程方式,使得当某个事件发生时,可以自动...
通过将Signal和Slot连接起来,可以实现事件驱动编程。 #### 3. 简单示例:PyPI信息查询器 在这个例子中,我们将创建一个简单的应用,用以查询PyPI(Python Package Index)中的信息。 1. **创建表单**:首先使用...
在信号和槽(Signal and Slot)机制中,QT提供了一种连接对象方法的方式,使得当特定事件发生时(例如用户点击按钮),可以触发相应的函数执行。报告中提到,如果用户已经输入了一个小数点,会禁用小数点按钮,防止...