FrameWork
最爱吹吹风
觉悟
展开
-
Mars长连接管理
对长连的管理有两个方面,一个是心跳(HeartBeat),一个是重连(Reconnect)。这两个动作都是有策略性的。一般心跳会间隔性的发出一个很小的心跳包,通过服务端返回来判断连接是否健康。在网络断开会,会自动重连,一般遵循逐渐递增的方法,递增的策略有所不同。在Mars中,对这两个策略有更精细化的管理,在Mars中对App运行的状态分了两种1.前台活动状态(forground-a...原创 2020-04-28 15:41:08 · 1125 阅读 · 0 评论 -
IM网络层设计
协议层设计flag version command size header body架构设计最底层: socket层,做最底层的TCP连接并且对接协议,包括消息的解包 中间层: 连接管理层, 用于对底层连接做管理。包括连接的ping策略,重连,握手,连接性能统计。 最上层,直接对接业务的一层。包括连接管理层配置信息拉取,日志输出,对外接口等等。问题记录:1. window...原创 2019-11-19 09:36:02 · 341 阅读 · 0 评论 -
RPC进程间通信的一种实现
客户端项目中不可避免的要用到进程间的通信,方式也多种多样。单就开发而言,RPC这种模式最方便来做进程间通信的手段。因为类似于本地函数的调用。实现这个机制需要满足以下内容:接口定义。一个组件是否方便使用,主要是看接口的设计是否简洁合理。 满足本地函数调用的特点:函数未执行完不返回,只需要函数签名和函数参数这些信息。 是否支持一对多。调用方需要继承RPCService类,构造函数需要传...原创 2019-08-29 11:30:33 · 3235 阅读 · 0 评论 -
简单消费队列的实现(异步任务处理)
很多情况下要用到生产者-消费者这个模型,比如有很多任务要处理,但是又不能马上得到处理,这个时候就难免要将任务缓存下来慢慢消化。最普通的就是一对一的模式,一个生产者,一个消费者。那么有几个点需要考虑:生产速度大于消费速度,这个时候就需要队列的支持,需要把任务缓存下来慢慢消化 匀速消化,保证任务执行之间的间隔时间相同,很多情况下我们是有这个要求的,比如有一堆绘制任务,不能无节制的全部交给屏幕绘制...原创 2019-08-12 20:17:22 · 4147 阅读 · 0 评论 -
基于QT的日志模块
C++工程中的日志模块,第三方的已经有很多了,比如boost.log ,log4cpp等等,都提供了很便利的方法。boost中log模块参见之前的文章:https://blog.csdn.net/linfengmove/article/details/85077462这些日志模块都会涉及到日志的清除策略和分割策略。因为先有工程师基于QT来做的,又不想引入boost这个大块,所以就基于QT的日志...原创 2019-08-19 12:09:44 · 1658 阅读 · 1 评论 -
容器进程(QQExternal)
容器进程的意义在于这个进程并没有指定的功能,他只是负责来加载其他模块(dll),相对于普通进程的优势就是,不用单独去做一个进程,在VS中我们只用关注实现逻辑就好,当需要这个功能单独运行在一个进程中的时候,我们可以方便的用容器进程去加载他,类似于Windows自带的rundll功能。但是我们的容器进程可以有更强大的辅助功能,可以提供进程间通信接口,让多进程编程更加容易。如果关注过QQ的QQExter...原创 2019-07-18 11:03:59 · 547 阅读 · 0 评论 -
2018.08-2019.02总结
在这6个月的时间里最有价值的事情莫过于结识了一群人,融入了一个新团队。这段时间中无论是本团队还是外部团队都有合作,总体来讲我们相处愉快,并且完成了既定目标。 在技术方面,鉴于以前的客户端建立在云信demo之上,逻辑与界面糅杂,造成聊天室模块过于臃肿,在此基础之上的开发也变得困难重重,所以采取了以下措施: 1.开发了一套底层框架,用于解耦各个部分,框架包括3中机制: ...原创 2019-02-18 11:19:07 · 103 阅读 · 0 评论 -
创建扩展性良好的框架-通知框架(实现)
一般来说通知框架可以有效的解耦业务逻辑,就类似于订阅者模式,任何模块都可以注册自己关注的接口,接口事件发生时会主动通知该模块。通知框架向外部提供的宏://注册通知#define LISTEN(INotify)\AddInterface(#INotify, (void*)(INotify*)this);//去除通知#define UNLISTEN(INotify...原创 2020-02-26 16:09:08 · 133 阅读 · 0 评论 -
创建扩展性良好的框架-单例框架(实现)
单例可以算是业务开发中最常用的方式,一个对象可以全局使用,但是普通的单例对象只能在当前模块(exe/dll)中使用,其他模块要使用的话需要显示导出才可以,不利于业务之间的交互。 宏接口://注册单例接口#define REGINSTANCE(interface, CLASS)\static auto interface##Func = []()\{\ sta...原创 2020-02-26 16:35:03 · 96 阅读 · 0 评论 -
创建扩展性良好的框架-插件框架(实现)
一般在业务开发中,要分很多个模块来进行协作,模块多了之后就会有依赖问题,包括模块的启动顺序,统一初始化,释放资源等等,所以就需要一个来管理模块的框架,插件框架。外部接口:插件管理启动所有注册插件,并初始化//启动框架#define STARTCOMPONENTSERVICE StartComponent(); 注册模块(dll), 并在dll中实现以下虚接口供插件管理调用...原创 2020-02-26 16:34:51 · 102 阅读 · 0 评论 -
本地缓存(key-value)
目前在做本地缓存时常用的方式是用sqlite作为本地缓存数据库,缓存使用的场景很多,每次都设计表就变成一件很麻烦的事情,而且很多场景就只是用来记录一些配置信息,所以采用key-value这种接口去封装sqlite就是一种很好的方式。接口:#include <string>class LocalStorage{public: SINGLETON_DEFINE(Loca...原创 2020-02-26 16:35:24 · 457 阅读 · 0 评论 -
一种单例的实现方法
核心方法:typedef void*(*FUNC)();#define GETINSTANCE(interface, object)\ {\ FUNC func = (FUNC)GetCreateObjectFunc(#interface);\ if(nullptr != func)\ {\ object = (interface*)func();\...原创 2018-09-11 00:16:43 · 233 阅读 · 0 评论 -
创建扩展性良好的框架-(通知\单例\插件)框架
面向外部的接口:#pragma once#include <functional>#ifdef CORECENTER_EXPORTS#define CORECENTER_EXPORTS __declspec(dllexport)#else#define CORECENTER_EXPORTS#endifextern "C"{ CORECENTER_EXPORTS ...原创 2020-02-26 16:08:51 · 118 阅读 · 0 评论