`
runfeel
  • 浏览: 935594 次
文章分类
社区版块
存档分类
最新评论

自己实现的Signal and slot

 
阅读更多

我自己实现的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

    "03_SignalAndSlot.ZIP"中的内容很可能是关于如何在主窗口(MainWindow)与子窗口(ChildWindow)之间利用信号和槽进行交互的实例教程。下面我们将深入探讨这一主题。 信号(Signal)是QT框架中的一种特殊函数,它...

    signalandslot.rar

    本项目“signalandslot.rar”包含了作者在学习如何自定义信号和槽、处理信号与槽重载以及利用lambda表达式进行信号连接时编写的代码示例,非常适合初学者和进阶者学习QT编程的这一重要部分。 首先,让我们详细了解...

    03_SignalAndSlot.rar

    总之,“03_SignalAndSlot.rar”文件可能包含了关于Qt信号与槽机制的深入讲解,包括它们的工作原理、如何使用`connect`函数进行连接、不同类型的连接方式以及实际应用场景。通过学习这部分内容,开发者能够更好地...

    Signal and Slot for Java-开源

    在Java中实现Signal和Slot,我们首先需要定义一个Signal类,这个类会包含一个或多个表示不同事件的方法。每个方法可以代表一个Signal,参数类型和数量应与期望的Signal相匹配。然后,创建一个Slot接口,其中包含要...

    Qt开发:QT平台经典的信号槽机制开发程序

    在本项目"SignalAndSlot"中,我们将深入探讨Qt的信号槽机制以及如何在实际程序中运用。 信号(Signal)和槽(Slot)是Qt事件驱动模型的关键组成部分。信号表示一个事件的发生,而槽则定义了当信号被触发时应执行的...

    black berry datamodel

    本篇文章将深入探讨BlackBerry Datamodel的几个核心知识点,包括信号与槽(Signal and Slot)、排序数据模型(Sorted Data Models)、异步数据提供(Asynchronous Data Providing)以及未排序数据模型(Unsorted ...

    12.2 Qt5多线程:使用信号量实现生产者和消费者

    6. **线程间的通信**:在生产者和消费者之间,可能还需要额外的信号和槽(signal and slot)来协调他们的操作,比如当缓冲区满时通知生产者停止生产,或者当缓冲区空时通知消费者暂停消费。 通过以上步骤,我们可以...

    PyQt4 精彩实例分析 中文pdf

    利用信号与槽(signal and slot)机制,程序中将按钮的clicked信号与QApplication的quit()槽连接,当按钮被点击时,会触发quit()方法来退出应用程序。 信号与槽机制是Qt中用于对象间通信的一种机制,是Qt编程的核心...

    Qt导航栏Demo之侧边垂直菜单

    我们可以通过为QPushButton设置信号和槽(signal and slot)来响应用户的点击操作。 鼠标钩子函数,通常是指QApplication::installEventFilter(),用于捕获全局鼠标事件。在这个场景下,我们可以利用它来跟踪鼠标...

    QT基本对话框资料

    2. **多槽连接**:同一信号可以与多个槽关联,如`connect(Object1,SIGNAL(signal1),Object2,SLOT(slot1))`和`connect(Object1,SIGNAL(signal1),Object2,SLOT(slot2))`,意味着当`Object1`的`signal1`被触发时,`...

    Qt图片按钮类(是QT,看清楚再下载)

    这些文件通常包含应用程序的主要逻辑,包括如何创建和管理按钮,以及处理按钮的信号和槽(signal and slot)机制。信号和槽是Qt中的一个核心特性,它使得对象之间的通信变得简单直接。 `main.cpp`是Qt应用程序的...

    Linux下图形用户界面程序的开发与实现.pdf

    Qt 的 C++ API 设计优雅,提供了信号与槽机制(Signal and Slot),使得对象间通信变得简单直观,增强了代码的可读性和可维护性。 ### 5. 开源与商业版本 Qt 同时提供开源版本和商业版本。开源版本允许开发者在 ...

    Rapid GUI programming with python and QT PH

    - **信号(Signal)与槽(Slot)机制详解** - **国际化(Internationalization)与本地化(Localization)的支持** - **多平台兼容性的处理技巧** #### Python与Qt结合的优势 Python作为一种高级编程语言,以其简洁易读的...

    基于Qt4的图形用户界面程序的设计与实现

    connect(resetButton, SIGNAL(clicked()), this, SLOT(initGame())); ``` #### 结论 基于Qt4的图形用户界面程序设计与实现充分展现了Qt框架的强大功能和灵活性。信号与槽机制以及事件处理机制的运用,不仅简化了...

    QT中关于信号和槽的介绍

    在QT框架中,信号(Signal)与槽(Slot)机制是一种独特的对象间通信方式,它不仅为开发人员提供了更为灵活和安全的方法来构建交互式的GUI应用,而且也是QT区别于其他GUI库的重要特性之一。本文将详细介绍信号与槽的基本...

    Qt时钟源码

    信号与槽(Signal and Slot)是Qt框架中用于对象间通信的关键机制,它替代了传统的回调函数,提供了更安全、更灵活的事件处理方式。在`Clock`类中,通过创建一个`QTimer`对象并将其与`update()`槽函数连接,实现了每...

    C++课程设计:基于Ubuntu16.04的QT界面局域网聊天系统.zip

    除此之外,为了实现聊天功能,项目可能还涉及到了字符串处理(QString类)、信号与槽机制(signal and slot)以及序列化和反序列化技术。信号与槽机制是QT中一种事件驱动的编程方式,使得当某个事件发生时,可以自动...

    PyCon_UK_2007_PyQt_and_Qt_Designer.pdf

    通过将Signal和Slot连接起来,可以实现事件驱动编程。 #### 3. 简单示例:PyPI信息查询器 在这个例子中,我们将创建一个简单的应用,用以查询PyPI(Python Package Index)中的信息。 1. **创建表单**:首先使用...

    QT课程设计报告范本模板.docx

    在信号和槽(Signal and Slot)机制中,QT提供了一种连接对象方法的方式,使得当特定事件发生时(例如用户点击按钮),可以触发相应的函数执行。报告中提到,如果用户已经输入了一个小数点,会禁用小数点按钮,防止...

Global site tag (gtag.js) - Google Analytics