在面向对象的系统中,当一个对象接收到一条消息时,可能会发生一系列的事件。通常,这些事件是以 同步(synchronous) 模式处理的:调用进程或向这个对象发送消息的线程在发送消息调用完成之前都会接收并处理一系列事件。
然而,如果产生这些事件的对象是由多个进程进行共享并且保存在共享内存中时,情况就稍微有些不同了。本文将使用两种 C++ 设计模式来详细介绍这种情况,并使用一些样例代码来展示这种解决方案(这些样例代码可以从本文 下载 一节中获得):
- 我们将简要介绍不使用共享内存的样例代码。
- 使用第一种设计模式来修改这些代码,让其使用共享内存。
- 然后阐述如何使用第二种设计模式来实现进程间通信(IPC)。
您可以在任何机器体系架构、操作系统和编译器上应用这两种设计模式中的概念。对于本文来说,我们使用的是 RedHat Linux 7.1 for 32-bit x86 Intel® 体系架构的发行版;使用 GNU C++ compiler version 3.2.3 编译器及其相关工具来编译并测试样例程序。
不使用共享内存
下面让我们开始介绍这个样例程序,首先是不使用共享内存的程序:
清单 1. common.h
#ifndef __COMMON_H__
#define __COMMON_H__
class IObjectWithEvents
{
public:
class IEventSink
{
public:
virtual void OnEvent(pid_t pid, const char * msg) = 0;
};
static IObjectWithEvents * getInstance();
virtual bool AddEventHandler(IEventSink * pEI) = 0;
virtual void SendMessage() = 0;
};
#endif //__COMMON_H__
|
接口类 IObjectWithEvents 包含了一个内嵌的接口类 IEventSink,它定义了 OnEvent() 方法。这个事件处理程序接收一个发送者的 id 和一个字符串消息。getInstance() 方法返回对共享内存中对象的引用,AddEventHandler() 注册一个事件处理程序,SendMessage() 向这个对象发送一条消息。由于不需要引用共享内存,所以可以像清单 2 中那样来使用 IObjectWithEvents:
清单 2. shm-client1.cpp
#include <iostream>
#include <sys/types.h>
#include <unistd.h>
#include "common.h"
#define HERE __FILE__ << ":" << __LINE__ << " "
using namespace std;
class EventSink : public IObjectWithEvents::IEventSink
{
public:
void OnEvent(pid_t pid, const char * msg)
{
cout << HERE << "Message from pid(" << pid << ")\t : " << msg << endl;
}
};
int main()
{
IObjectWithEvents * powe = IObjectWithEvents::getInstance();
EventSink sink;
powe->AddEventHandler(&sink);
powe->SendMessage();
return 0;
}
|
类 EventSink 提供了这个事件处理程序的实现。主函数中给出了用于发送消息和处理事件的标准序列。
ObjectWithEvents 的典型实现如清单 3、4 所示:
清单 3. ObjectWithEvents.h
#include "common.h"
class ObjectWithEvents : public IObjectWithEvents
{
public:
// We assume singleton design pattern for illustration
static ObjectWithEvents * ms_pObjectWithEvents;
ObjectWithEvents();
//the implementation for IObjectWithEvents
void FireEvent();
virtual bool AddEventHandler(IEventSink * pEI);
virtual void SendMessage();
//Collection for maintaining events
enum { MAX_EVENT_HANDLERS = 16, };
long m_npEI;
IEventSink * m_apEI[MAX_EVENT_HANDLERS];
pid_t m_alPID[MAX_EVENT_HANDLERS];
};
|
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
相关专题
- 共享上网专题 (2202篇文章)
- 三机互联与共享专题 (2284篇文章)
- 局域网共享专题 (2649篇文章)
- Adsl共享上网 (2241篇文章)
- Linux集群技术 (8375篇文章)
- 体验Linux的音影世界 (8047篇文章)
- Linux驱动大全 (8847篇文章)
- Linux下的路由的配置与应用 (11847篇文章)
- Linux命令简介 (9900篇文章)
- 数据库处理专题 (8676篇文章)
- 实用技巧:配置Linux操作系统环境变量 (30次浏览)
- 安装qmail全套功略 (18次浏览)
- TurboLinux 入门教程:第七课 TurboLinux简介 (18次浏览)
- Linux系统管理员秘技:用快捷命令一招制胜 (18次浏览)
- Linux系统命令分类详解 (1) (18次浏览)
- Linux下使用aMsn详解 (18次浏览)
- 你会在Linux下用POP3收Web电子邮箱吗? (18次浏览)
- 在Linux中用三款工具轻松制作网页 (18次浏览)
- Linux上的偷窺裝置 (1394的使用) (18次浏览)
- 深入浅出分析Linux内核漏洞的问题 (18次浏览)



