我的2016年终总结(PF项目框架设计心得分享 2.0rc)
在无数的日夜里,熬出了多少的黑眼圈,致勤勤恳恳工作的各位朋友与自己。每到了年末的时候总想写的什么,主要是为了回顾以往一年里到底做了什么,这便是年终总结的主要意义。在此我将要总结的是和我在技术层面上成长的一个项目,那便是开源的plain framework(简称PF),我会在这里分享一些关于程序设计的一些心得。
起源
结构
版本
接口
待续……
编译
测试

/**
* GLOBALS["default.engine.frame"] = number; //default 100.
* GLOBALS["default.net.open"] = bool; //default false.
* GLOBALS["default.net.service"] = bool; //default false.
* GLOBALS["default.net.service_ip"] = string; //default "".
* GLOBALS["default.net.service_port"] = number; //default 0.
* GLOBALS["default.net.conn_max"] = number; //default NET_CONNECTION_MAX.
* GLOBALS["default.script.open"] = bool; //default false.
* GLOBALS["default.script.rootpath"] = string; //default SCRIPT_ROOT_PATH.
* GLOBALS["default.script.workpath"] = string; //default SCRIPT_WORK_PATH.
* GLOBALS["default.script.bootstrap"] = string; //default "bootstrap.lua".
* GLOBALS["default.script.type"] = number; //default pf_script::kTypeLua.
* GLOBALS["default.cache.open"] = bool; //default fasle.
* GLOBALS["default.cache.service"] = bool; //default fasle.
* GLOBALS["default.cache.conf"] = string; //default "".
* GLOBALS["default.cache.key_map"] = number; //default ID_INVALID.
* GLOBALS["default.cache.recycle_map"] = number; //default ID_INVALID.
* GLOBALS["default.cache.query_map"] = number; //default ID_INVALID.
* GLOBALS["default.db.open"] = bool; //default fasle.
* GLOBALS["default.db.type"] = number; //default kDBConnectorTypeODBC.
* GLOBALS["default.db.server"] = string; //default "".
* GLOBALS["default.db.user"] = string; //default "".
* GLOBALS["default.db.password"] = string; //default "".
**/ #include "main.h"
#include "net.h"
#include "packet/sayhello.h" //The script reload function.
void reload() {
if (is_null(ENGINE_POINTER)) return;
auto env = ENGINE_POINTER->get_script();
if (is_null(env)) return;
env->reload("preload.lua");
} //The test engine main loop event 1.
int32_t times = ;
void main_loop(pf_engine::Kernel &engine) {
std::cout << "main_loop ..." << std::endl;
++times;
if (times > )
std::cout << "main_loop exited by 10 times" << std::endl;
else
engine.enqueue([&engine](){ main_loop(engine); });
} //The test engine main loop event 2.
void main_loop1(pf_engine::Kernel &engine) {
std::cout << "main_loop1 ..." << std::endl;
++times;
if (times > )
std::cout << "main_loop1 exited by 20 times" << std::endl;
else
engine.enqueue([&engine](){ main_loop1(engine); });
} //Net test.
pf_net::connection::Basic *connector{nullptr};
void main_nconnect(pf_engine::Kernel &engine,
pf_net::connection::manager::Connector &mconnector) {
mconnector.tick();
if (is_null(connector)) {
connector = mconnector.connect(
"127.0.0.1", GLOBALS["default.net.service_port"].uint16());
} else {
static uint32_t last_time = ;
auto tickcount = TIME_MANAGER_POINTER->get_tickcount();
if (tickcount - last_time > ) {
SayHello packet;
packet.set_str("hello ...");
connector->send(&packet);
last_time = tickcount;
}
}
engine.enqueue([&engine, &mconnector](){ main_nconnect(engine, mconnector); });
} //DB test.
void db_test(pf_engine::Kernel &engine) {
auto db = engine.get_db();
if (is_null(db)) return;
if (db->isready()) {
db_query_t db_query;
pf_db::Query query(&db_query);
if (!query.init(db)) return;
query.set_tablename("t_test");
query.select("*");
query.from();
query.limit();
if (query.execute()) {
pf_basic::io_cwarn("------------------------db---------------------------");
db_fetch_array_t fectch_array;
query.fetcharray(fectch_array);
pf_basic::io_cdebug("db_test keys: ");
for (pf_basic::type::variable_t &key : fectch_array.keys)
std::cout << key.string() << std::endl;
pf_basic::io_cdebug("db_test values: ");
for (pf_basic::type::variable_t &val : fectch_array.values)
std::cout << val.string() << std::endl;
pf_basic::io_cwarn("------------------------db---------------------------");
}
} else {
engine.enqueue([&engine](){ db_test(engine); });
}
} int32_t main(int32_t argc, char * argv[]) {
/* Base config. */
GLOBALS["app.debug"] = true;
GLOBALS["app.name"] = "simple"; //Net.
GLOBALS["default.net.open"] = true;
GLOBALS["default.net.service"] = true;
GLOBALS["default.net.service_port"] = ; //DB.
GLOBALS["default.db.open"] = true;
GLOBALS["default.db.server"] = "pf_test";
GLOBALS["default.db.user"] = "root";
GLOBALS["default.db.password"] = "mysql"; //Script.
GLOBALS["default.script.open"] = true; /* engine. */
pf_engine::Kernel engine;
pf_engine::Application app(&engine); /* command handler. */
app.register_commandhandler("--reload", "lua script reload.", reload); /* engine event. */
engine.enqueue([](){ std::cout << "main loop function1" << std::endl; });
engine.enqueue([&engine](){ main_loop(engine); });
engine.enqueue([&engine](){ main_loop1(engine); });
engine.enqueue([&engine](){ db_test(engine); }); /* net init. */
pf_net::connection::manager::Connector mconnector;
init_net_packets();
mconnector.init();
engine.enqueue([&engine, &mconnector](){ main_nconnect(engine, mconnector); }); /* run */
app.run(argc, argv);
return ;
}
在测试里面加入了基本的网络、脚本、数据库的测试,大家可以先尝试摸索一下,从上述代码中可以见到现在框架的比1.0版本简洁许多。
在1.0中我就用到了全局变量,在设计的时候感觉十分冗杂,所以2.0后统一使用GLOBALS来代替,这样使用起来也方便。
最后
匆匆的写了这么一些,希望大家不要见怪,等有时间会把这篇文章修改好的。
地址
我的2016年终总结(PF项目框架设计心得分享 2.0rc)的更多相关文章
- 我的2017年终总结(PF项目框架设计心得分享 1.0rc new)
一晃眼又过去了一年,在这一年里尽管有许多不如意的事,却阻挡不了我前进的脚步.先用一句话来总结去年一年的状态,那就是“无休无止的忙碌”.而这样的忙碌状态对我来说是不可取的,因为匮乏的忙碌只能让头脑处于一 ...
- (三) Angular2项目框架搭建心得
前言: 在哪看到过angular程序员被React程序员鄙视,略显尴尬,确实Angular挺值得被调侃的,在1.*版本存在的几个性能问题,性能优化的"潜规则"贼多,以及从1.*到2 ...
- 【iOS】小项目框架设计(ReactiveCocoa+MVVM+AFNetworking+FMDB)
上一个项目使用到了ReactiveCocoa+MVVM+AFNetworking+FMDB框架设计,从最初的尝试,到后来不断思考和学习,现在对这样一个整体设计还是有了一定了理解与心得.在此与大家分享下 ...
- MegEngine 框架设计
MegEngine 框架设计 MegEngine 技术负责人许欣然将带了解一个深度学习框架是如何把网络的定义逐步优化并最终执行的,从框架开发者的视角来看待深度学习. 背景 AI 浪潮一波又一波,仿佛不 ...
- iOS 从零到一搭建组件化项目框架
随着公司业务需求的不断迭代发展,工程的代码量和业务逻辑也越来越多,原始的开发模式和架构已经无法满足我们的业务发展速度了,这时我们就需要将原始项目进行一次重构大手术了.这时我们应该很清晰这次手术的动刀口 ...
- Cocoapods组件化之搭建组件化项目框架
一,概述 随着公司业务需求的不断迭代发展,工程的代码量和业务逻辑也越来越多,原始的开发模式和架构已经无法满足我们的业务发展速度了,这时我们就需要将原始项目进行一次重构大手术了.这时我们应该很清晰这次手 ...
- Angular企业级开发(5)-项目框架搭建
1.AngularJS Seed项目目录结构 AngularJS官方网站提供了一个angular-phonecat项目,另外一个就是Angular-Seed项目.所以大多数团队会基于Angular-S ...
- 2_MVC+EF+Autofac(dbfirst)轻型项目框架_用户权限验证
前言 接上面两篇 0_MVC+EF+Autofac(dbfirst)轻型项目框架_基本框架 与 1_MVC+EF+Autofac(dbfirst)轻型项目框架_core层(以登陆为例) .在第一篇中介 ...
- 1_MVC+EF+Autofac(dbfirst)轻型项目框架_core层(以登陆为例)
前言 在上一篇0_MVC+EF+Autofac(dbfirst)轻型项目框架_基本框架中,我已经介绍了这个轻型框架的层次结构,在下面的这篇文章中,我将以教师登陆功能为例,具体来扩充下我的core层的代 ...
随机推荐
- Python全栈【进程、线程】
Python全栈[进程.线程] 本节内容: 进程 线程 协程 I/O多路复用 进程 1.进程就是一个程序在一个数据集上的一次动态执行过程,进程是资源分配的最小单元. 2.进程一般由程序.数据集.进程控 ...
- Lua学习系列(一)
从现在开始,打算学习一门新的脚本语言-lua. 1.什么是lua? a) lua1 • Lua 1.0 was implemented as a library, in less then 6000 ...
- SpringMVC轻松学习-其他常用(四)
Spring MVC 3.0 深入 核心原理 1. 用户发送请求给服务器.url:user.do 2. 服务器收到请求.发现DispatchServlet可以处理.于是调用Disp ...
- mysql--学生课程成绩表
创建表student: CREATE TABLE `student` ( `sid` INT(11) NOT NULL AUTO_INCREMENT, `sname` VARCHAR(20) NOT ...
- python_json常用的方法
1. 什么是JSON? JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端 ...
- new sun.misc.BASE64Encoder()报错找不到jar包
解决方案1(推荐): 只需要在project build path中先移除JRE System Library,再添加库JRE System Library,重新编译后就一切正常了. 解决方案2: W ...
- laravel项目安装debugbar
在github上有laravel项目的debugbar,可以查看项目的页面引用.变量.数据库使用.内存和反应时间等,貌似是一个还不错的小工具,效果如下: 安装地址:https://github.com ...
- INC函数
1.inc(integer) inc(a)等于a:=a+1; 例: i := 100; inc(i); 结果:i等于101 2.inc(integer,integer) inc(a,b)等于a:=a+ ...
- stm8的独立看门狗与窗口看门狗
STM8拥有两个硬件看门狗,分别叫做独立看门狗和窗口看门狗 独立看门狗的框图如下 我们可以看到,独立看门狗的时钟来自于LSI内部低速振荡器,经过二分频到达看门狗外设单元,在经过一个七位的预分频到达计数 ...
- leetcode--002 rpn
package leetcode; import java.util.Stack; public class RPN { public static int evalRPN(String[] toke ...