企业网站标题优化,深圳设计院工资一般多少,Wordpress显示成缩略图,网络公司网站文章目录 2 类图设计3 时序图数据输入处理#xff1a;输出数据处理总流程 4 主要实现的功能4.1 kernel类#xff1a;基于epoll调度所有通道4.2 通道抽象类#xff1a;4.3 标准输入通道子类4.4 标准输出通道子类4.5 kernel和通道类的调用 5 代码设计5.1 框架头文件5.2 框架实… 文章目录 2 类图设计3 时序图数据输入处理输出数据处理总流程 4 主要实现的功能4.1 kernel类基于epoll调度所有通道4.2 通道抽象类4.3 标准输入通道子类4.4 标准输出通道子类4.5 kernel和通道类的调用 5 代码设计5.1 框架头文件5.2 框架实现 遇到的问题: 输入通道类stdin和输出通道类stdout与很多相同点无需写重复代码
抽象: 定义通道抽象类把输入和输出的不同通过虚函数扩展
通道抽象类设计
提供虚函数用于泛化读写提供虚函数用于返回对应的文件描述符epoll处理输出所以需要输出缓冲区对外提供输出数据调用将数据放到输出缓冲区等待epoll调用对外提供泛化扩展用于处理输入的数据
kernel类适配修改
用抽象类指针list存储当前需要侦听的channel根据需求动态地调整epoll事件的监听种类
stdin类重构stdout类创建:
继承抽象通道类实现纯虚函数
2 类图设计
一个kernel存放所有的标准通道父类指针。数据处理放在标准通道中。
3 时序图
数据输入处理 输出数据处理 总流程 4 主要实现的功能
4.1 kernel类基于epoll调度所有通道
4.2 通道抽象类
写出缓冲区函数 将数据追加到缓冲区的函数 虚函数读写获取fd数据处理
4.3 标准输入通道子类
重写读和处理的函数 处理数据的函数将数据交给输出通道
4.4 标准输出通道子类
重写写数据的函数
4.5 kernel和通道类的调用
创建通道对象成员赋值 添加通道到kernel run
5 代码设计
5.1 框架头文件
/*框架头文件*/
class Ichannel {
public:virtual bool ReadFd(std::string _input) 0;virtual bool WriteFd(std::string _output) 0;virtual int GetFd() 0;virtual bool DataProcess(std::string _data) 0;void DataSendOut();void DataPush(std::string _data);std::liststd::string m_write_buffer;
};class ZinxKernel {
private:ZinxKernel();~ZinxKernel();int iEpollFd -1;static ZinxKernel *poZinxKernel;std::listIchannel* m_channel_list;
public:static bool ZinxKernelInit();static void ZinxKernelFini();static void Zinx_Run();static bool Zinx_Add_Channel(Ichannel _oChannel);static void Zinx_Del_Channel(Ichannel _oChannel);static void Zinx_SetChannelOut(Ichannel _oChannel);static void Zinx_ClearChannelOut(Ichannel _oChannel);static ZinxKernel *GetInstance() {if (NULL poZinxKernel){poZinxKernel new ZinxKernel();}return poZinxKernel;}
};5.2 框架实现
/*业务编写读用户输入向终端输出*/
#include Zinx.husing namespace std;class stdout_channel :public Ichannel {
public:// 通过 Ichannel 继承virtual bool ReadFd(std::string _input) override{return false;}virtual bool WriteFd(std::string _output) override{cout _output endl;return true;}virtual int GetFd() override{return 1;}virtual bool DataProcess(std::string _data) override{return false;}} *poOut new stdout_channel();class stdin_channel :public Ichannel {
public:// 通过 Ichannel 继承virtual bool ReadFd(std::string _input) override{cin _input;return true;}virtual bool WriteFd(std::string _output) override{return false;}virtual int GetFd() override{return 0;}virtual bool DataProcess(std::string _data) override{poOut-DataPush(_data);return true;}};int main()
{ZinxKernel::ZinxKernelInit();ZinxKernel::Zinx_Add_Channel(*(new stdin_channel()));ZinxKernel::Zinx_Add_Channel(*poOut);ZinxKernel::Zinx_Run();ZinxKernel::ZinxKernelFini();
}