【C++】开源:cpp-tbox百宝箱组件库

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍cpp-tbox百宝箱组件库。
无专精则不能成,无涉猎则不能通。。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • :smirk:1. 项目介绍
    • :blush:2. 安装运行
    • :satisfied:3. 进阶使用

😏1. 项目介绍

项目Github地址:https://github.com/cpp-main/cpp-tbox

cpp-tbox 是一个跨平台、轻量级的 C++ 工具库,旨在提供丰富的常用功能和便捷的编程接口。它的设计目标是简单易用、高效可靠,并且具有较低的资源消耗。

以下是 cpp-tbox 的一些特点和功能:

1.跨平台支持:cpp-tbox 可以在多个主流操作系统上运行,包括 Windows、Linux、Mac等。它封装了操作系统相关的功能,提供了统一的接口,使得开发者可以在不同的平台下写出可移植的代码。

2.线程和并发支持:cpp-tbox 提供了线程管理、互斥锁、条件变量等基础的线程和并发功能。你可以使用 cpp-tbox 来创建和控制线程,进行线程同步和互斥操作,实现多线程并发编程。

3.内存管理:cpp-tbox 提供了内存管理的工具和接口,帮助你更方便地进行内存分配和释放。它封装了常用的内存操作,如动态内存分配、内存对齐、内存拷贝等,提供了安全和高效的内存管理功能。

4.常用数据结构和算法:cpp-tbox 实现了许多常用的数据结构和算法,如动态数组、链表、哈希表、堆等。它们被设计为高效和易用的,可以满足各种场景下的需求。

5.文件和IO操作:cpp-tbox 提供了便捷的文件和IO操作接口,使得文件处理和IO操作变得更简单。你可以使用 cpp-tbox 来读写文件、创建目录、遍历文件系统等。

6.字符串操作:cpp-tbox 封装了常见的字符串处理操作,如拆分、连接、格式化等。它还提供了正则表达式的支持,使得字符串匹配和替换更方便。

7.时间和日期处理:cpp-tbox 提供了时间和日期相关的功能,如获取当前时间、计算时间差、日期格式化等。它还支持时区转换,以及常见的时间和日期操作。

😊2. 安装运行

编译运行:

cd cpp-tbox
# make编译
make 3rd-party modules RELEASE=1 STAGING_DIR=$HOME/.tbox
# cmake编译
cmake -B build -DCMAKE_INSTALL_PREFIX=$HOME/.tbox
# 完成之后,头文件与库文件都在 $HOME/.tbox 路径下

另外,这个开源项目也配套了使用教程:https://gitee.com/cpp-master/cpp-tbox-tutorials/blob/master/README.md

我已经跟着走了一遍,感觉还是不错的,可以学到一些东西。

😆3. 进阶使用

一个基本的基于reactor事件的进程:

#include <tbox/main/main.h>namespace app1 {class App : public tbox::main::Module
{public:App(tbox::main::Context &ctx);~App();protected:virtual bool onInit(const tbox::Json &cfg) override;virtual bool onStart() override;virtual void onStop() override;virtual void onCleanup() override;
};}

Makefile示例:

TARGET:=demoOBJECTS:=app_main.oCXXFLAGS:=-I$(HOME)/.tbox/include -DLOG_MODULE_ID='"demo"'
LDFLAGS:=-L$(HOME)/.tbox/lib -rdynamic
LIBS:=\-ltbox_main \-ltbox_terminal \-ltbox_network \-ltbox_eventx \-ltbox_event \-ltbox_log \-ltbox_util \-ltbox_base \-lpthread -ldl$(TARGET): $(OBJECTS)g++ -o $@ $^ $(LDFLAGS) $(LIBS)clean:rm *.o

一个打印日志的示例:

#include <tbox/main/module.h>
#include <tbox/base/log.h>#include <iostream>class MyModule : public tbox::main::Module {public:explicit MyModule(tbox::main::Context &ctx) : tbox::main::Module("my", ctx) { }virtual ~MyModule() { }public:virtual bool onInit(const tbox::Json &js) override { // 等级、时间点、线程号、模块名、函数名、内容、文件名:行号std::cout << "======= Start print log!" << std::endl;LogFatal("this is fatal log");LogErr("this is error log");LogWarn("this is warn log");LogInfo("this is info log");LogDbg("this is debug log");return true; }virtual bool onStart() override { LogTag(); return true; }virtual void onStop() override { LogTag(); }virtual void onCleanup() override { LogTag(); }
};namespace tbox {
namespace main {
void RegisterApps(Module &apps, Context &ctx) {apps.add(new MyModule(ctx));std::cout << "======= Start print log2!" << std::endl;
}
}
}

一个定时器事件:

#include <tbox/main/module.h>
#include <tbox/base/log.h>
#include <tbox/event/timer_event.h> /// 导入TimerEvent类class MyModule : public tbox::main::Module {public:explicit MyModule(tbox::main::Context &ctx): tbox::main::Module("my", ctx), tick_timer_(ctx.loop()->newTimerEvent())    /// 实例化定时器对象{ }virtual ~MyModule() { delete tick_timer_; } /// 释放定时器对象public:virtual bool onInit(const tbox::Json &js) override {/// 初始化,设置定时间隔为1s,持续触发tick_timer_->initialize(std::chrono::seconds(1), tbox::event::Event::Mode::kPersist); // kPersist kOneshot/// 设置定时器触发时的回调tick_timer_->setCallback([this] { onTick(); });return true;}/// 启动virtual bool onStart() {tick_timer_->enable();return true;}/// 停止virtual void onStop() {tick_timer_->disable();}private:void onTick() {++count_;LogDbg("count:%d", count_);}private:tbox::event::TimerEvent *tick_timer_;int count_ = 0;
};namespace tbox {
namespace main {
void RegisterApps(Module &apps, Context &ctx) {apps.add(new MyModule(ctx));
}
}
}

一个信号事件的处理:

#include <unistd.h>
#include <tbox/main/module.h>
#include <tbox/base/log.h>
#include <tbox/event/timer_event.h>
#include <tbox/event/signal_event.h>    //! 导入SignalEventusing namespace std::placeholders;class MyModule : public tbox::main::Module {public:explicit MyModule(tbox::main::Context &ctx): tbox::main::Module("my", ctx), tick_timer_(ctx.loop()->newTimerEvent()), signal_event_(ctx.loop()->newSignalEvent())   //! 实例化SignalEvent对象{ }virtual ~MyModule() {delete signal_event_;   //! 释放SignalEvent对象delete tick_timer_;}public:virtual bool onInit(const tbox::Json &js) override {tick_timer_->initialize(std::chrono::seconds(1), tbox::event::Event::Mode::kPersist);tick_timer_->setCallback([this] { onTick(); });//! 初始化SignalEvent,令其同时监听SIGUSR1,SIGUSR2信号,且是持续有效signal_event_->initialize({SIGUSR1, SIGUSR2}, tbox::event::Event::Mode::kPersist);//! 设置回调函数,均指向onSignalEvent()signal_event_->setCallback(std::bind(&MyModule::onSignalEvent, this, _1));return true;}virtual bool onStart() {tick_timer_->enable();signal_event_->enable(); //! 使能SignalEventreturn true;}virtual void onStop() {signal_event_->disable();tick_timer_->disable();  //! 关闭SignalEvent}private:void onTick() {++count_;LogDbg("count:%d", count_);}//! 信号事件时的处理void onSignalEvent(int signo) {LogInfo("got signal: %d", signo);if (signo == SIGUSR1)tick_timer_->disable(); //! 关闭定时器else if (signo == SIGUSR2)tick_timer_->enable();  //! 打开定时器}private:tbox::event::TimerEvent  *tick_timer_;tbox::event::SignalEvent *signal_event_;    //!< 定义SignalEvent对象int count_ = 0;
};namespace tbox {
namespace main {
void RegisterApps(Module &apps, Context &ctx) {apps.add(new MyModule(ctx));
}
}
}

一个http服务示例:

#include <tbox/main/module.h>
#include <tbox/base/log.h>
#include <tbox/http/server/server.h> //! 导入Http服务class MyModule : public tbox::main::Module {public:explicit MyModule(tbox::main::Context &ctx): tbox::main::Module("my_http", ctx), http_server_(ctx.loop())  //! 实例化Http服务对象{ }public:virtual bool onInit(const tbox::Json &js) override {//! 初始化Http服务,绑定 0.0.0.0:12345 地址,backlog为2if (!http_server_.initialize(tbox::network::SockAddr::FromString("0.0.0.0:12345"), 2))return false;//! 指定Http服务的请求的处理方法http_server_.use([] (tbox::http::server::ContextSptr http_ctx,const tbox::http::server::NextFunc &next_func) {//! 不管请求的是什么,直接指定回复的body内容http_ctx->res().body = R"(<p>Welcome to CppTbox.</br>This is http example.</p>)";});return true;}virtual bool onStart() override {http_server_.start();   //! 启动Http服务return true;}virtual void onStop() override {http_server_.stop();    //! 停止Http服务}private:tbox::http::server::Server http_server_;    //! 定义Http服务对象
};namespace tbox {
namespace main {
void RegisterApps(Module &apps, Context &ctx) {apps.add(new MyModule(ctx));
}
}
}

在这里插入图片描述

以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/3020.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【大数据之Hive】二十五、HQL语法优化之小文件合并

1 优化说明 小文件优化可以从两个方面解决&#xff0c;在Map端输入的小文件合并&#xff0c;在Reduce端输出的小文件合并。 1.1 Map端输入文件合并 合并Map端输入的小文件是指将多个小文件分到同一个切片中&#xff0c;由一个Map Task处理&#xff0c;防止单个小文件启动一个M…

Jenkins (一)

Jenkins (一) Docker Jenkins 部署 一. 安装 jenkins $ mkdir -p /home/tester/data/docker/jenkins $ vim jenkins:lts-jdk11.sh./jenkins:lts-jdk11.sh 内容 #! /bin/bash mkdir -p /home/tester/data/docker/jenkins/jenkins_homesudo chown -R 1000:1000 /home/tester/da…

后端查询出的数据库数字自动补零和不补零

select CAST(YTD_CHANGE*100 as decimal(18,1)), round(YTD_CHANGE*100,1) from RP where data_date 20211231补零 round(PYTD_CHANGE_PER*100,1)不补零 CAST(PYTD_CHANGE_PER*100 as decimal(18,1))

PageHelper分页失效,只能查出第一页

PageHelper分页失效&#xff0c;只能查出第一页 1. 现象2. 原因3. PageHelper工作原理 1. 现象 分页代码如下&#xff1a; int pageId Constants.ONE;boolean isHasNextPage;do {PageHelper.startPage(pageId, Constants.DEFAULT_PAGE_SIZE);List<String> projectIdLi…

【SCI一区】【电动车】基于ADMM双层凸优化的燃料电池混合动力汽车研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 1.2 电动车动力学方程 1.3 电池模型 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码、数据、文章讲解 &#x1f4a5;1 概述 文献来源&#xff1a; 随着车辆互联性的出现&#xff0c;互联汽车 (CVs) 在增强道路安全、改…

数学建模-图论 最短路径

作图 %% 注意&#xff1a;以下代码需要较新版本的matlab才能运行&#xff08;最好是2016版本及以上哦&#xff09; % 如果运行出错请下载新版的matlab代码再运行%% Matlab作无向图 % &#xff08;1&#xff09;无权重&#xff08;每条边的权重默认为1&#xff09; % 函数graph(…

ES(2)基本使用

文章目录 创建索引查询索引查询 shopping索引查询所有索引 删除索引数据操作添加查询查询指定id数据 查询所有数据修改完全覆盖局部修改 删除 复杂查询操作条件查询根据字段名和值查询对应数据全量查询分页查询显示指定字段排序查询 多条件查询must&#xff08;and&#xff09;…

spring复习:(29)MutablePropertyValues

该类通过成员变量 propertyValueList 来保存多个PropertyValue对象。 public class MutablePropertyValues implements PropertyValues, Serializable {private final List<PropertyValue> propertyValueList;Nullableprivate Set<String> processedProperties;pr…

SQL进阶(2)——SQL语句类型 增删改查CRUD 事务初步 表关联关系 视图 +索引

目录 引出SQL语句类型1.DML数据操纵语言&#xff08;重点&#xff09;2.DQL数据查询语言&#xff08;重点&#xff09;3.DDL(Data Definition Language了解)4.DCL(Data Control Language了解)5.TCL 事务控制语言 运算符和其他函数1.运算符2.其它函数增删改查CRUD 视图索引事务1…

基于Python的用户和项目协同过滤算法实现与解析——以余弦相似度和最近邻居为基础的推荐系统构建

基于Python的用户和项目协同过滤算法实现与解析——以余弦相似度和最近邻居为基础的推荐系统构建 摘要 本篇文章主要讲解如何使用Python来编写基于用户的协同过滤算法和基于项目的协同过滤算法。我们首先了解这两种协同过滤算法的概念和原理,接着通过Python代码实现这两种算…

如何克服Leetcode做题的困境

文章目录 如何克服Leetcode做题的困境问题背景克服困境的建议实践与理论结合切忌死记硬背分析解题思路不要过早看答案迭代式学习寻求帮助坚持与耐心查漏补缺 结论 如何克服Leetcode做题的困境 问题背景 明明自觉学会了不少知识&#xff0c;可真正开始做Leetcode题目时&#x…

内存参数问题导致内存溢出

问题&#xff1a;内存参数问题导致内存溢出 1、文件过大&#xff0c;进行分块 2、 运行参数&#xff0c;使用最大内存配置2时&#xff0c;导致空指针异常。 3、获取详细报错信息-内存溢出 多线程捕获Throwable异常 修改代码&#xff0c;捕获Throwable&#xff0c;获取异常 异…

vue中预览pdf

情况一 如果后端返回的pdf地址&#xff0c;粘贴到浏览器的url框中&#xff0c;可以在浏览器中直接进行预览的&#xff0c;那么我们就用window.open&#xff0c;或 a标签&#xff0c;或iframe标签通过设置src进行预览即可 法1&#xff1a;可以直接使用window.open&#xff08;…

leetcode100.相同的树

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;相同的树 1️⃣ 代码&#xff1a; bool isSameTree(struct TreeNode* p, struct TreeNode* q){// 判断两棵树当前结点是否为空if (p NULL && q NULL) {// 说明是相同的return true;}// 来到这里有几种情况// …

【裸辞转行】是告别,也是新的开始

一年多了没有更新&#xff0c;是因为去年身体加心理因素辞职了&#xff0c;并且大概率不会再做程序员了&#xff0c;嗯。本来觉得可能再也不会打开 CSDN 了&#xff0c;想了想&#xff0c;还是来做个告别吧&#xff0c;任何事情都该有始有终才对。 回忆碎碎念 是在去年的 11 …

【实战篇】docker-compose部署go项目

一、场景&#xff1a; 二、需求 三、实操 Stage 1&#xff1a;GoLand 中 build 生成二进制文件 Stage 2&#xff1a;编写 Dockerfile Stage 3&#xff1a;编写 docker-compose.yaml Stage 4&#xff1a;文件上传到 ubuntu 服务器上&#xff0c;并设置文件读写权限 Stage…

前端 | (二)各种各样的常用标签 | 尚硅谷前端html+css零基础教程2023最新

学习来源&#xff1a;尚硅谷前端htmlcss零基础教程&#xff0c;2023最新前端开发html5css3视频 文章目录 &#x1f4da;HTML排版标签&#x1f4da;HTML语义化标签&#x1f4da;块级元素与行内元素&#x1f4da;文本标签&#x1f407;常用的文本标签&#x1f407;不常用的文本标…

erlang 虚拟机优化参数

sbwt none 将CPU忙等待关闭将有助于降低系统显示的CPU使用率&#xff0c;因为开启了忙等待的BEAM&#xff0c;CPU负载并不代表真实的工作情况&#xff1b; K true 开启epoll IO模型 swt low Sets scheduler wakeup threshold. Defaults to medium. The thresh…

Kubernetes Service的过程

文章目录 Kubernetes Service的实现基础内容1. 命令 ip route show table all2. DNAT3. IPVS和iptables4. Service Service的实现简述 Kubernetes Service的实现 基础内容 在了解Service之前,需要先了解一些额外的知识: 命令: ip route show table allDNATIPVS和iptables基础…

idea不小心push的文件夹怎么处理?

第一种方式&#xff0c;把不小心push上去的人解决掉。 第二种方式&#xff0c;以我自身为例&#xff0c;同事不小心push了.idea文件夹 首先打开git bash git rm --cached .idea/ -r 然后查看一下状态 git status 接着提交修改 git commit -m "cancel track .idea file&q…