【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,一经查实,立即删除!

相关文章

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(…

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…

如何克服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;}// 来到这里有几种情况// …

【实战篇】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;不常用的文本标…

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…

【Redis】高可用之三:集群(cluster)

本文是Redis系列第6篇&#xff0c;前5篇欢迎移步 【Redis】不卡壳的 Redis 学习之路&#xff1a;从十大数据类型开始入手_AQin1012的博客-CSDN博客关于Redis的数据类型&#xff0c;各个文章总有些小不同&#xff0c;我们这里讨论的是Redis 7.0&#xff0c;为确保准确&#xf…

Linux基础(三)端口、进程及主机状态管理、环境变量、文件管理

目录 端口 nmap netstat 进程管理 查看进程 关闭进程 主机状态监控 系统资源top命令 磁盘信息监控 网络状态监控 环境变量 $符号 自己设置环境变量 自定义环境变量PATH Linux的文件和下载 压缩和解压 tar命令 zip和unzip命令 端口 每个电脑有一个ip地址&#xff…

Vue项目实现在线预览pdf,并且可以批量打印pdf

最近遇到一个需求,就是要在页面上呈现pdf内容,并且还能用打印机批量打印pdf,最终效果如下: 当用户在列表页面,勾选中两条数据后,点击“打印表单”按钮之后,会跳到如下的预览页面: 预览页面顶部有个吸顶的效果,然后下方就展示出了2个pdf文件对应的内容,我们接着点击“…

echarts 地图点击常见问题

echats 散点图不支持缩放 echarts 地图点击激活label如何去除 高德loca 1.4版本热力图报错 绘制的颜色区间是 0 --1 高德地图销毁不生效 自己傻逼&#xff0c;每次没有清空数组导致叠加数据&#xff0c;约点数据越多。 为何用高德地图district.search查询不到别的省数据&…

[微信小程序] movable-view 可移动视图容器 - 范围问题

movable-view 可移动视图容器 可移动视图容器&#xff0c;在页面中可以拖拽滑动。movable-view必须在 movable-area 组件中&#xff0c;并且必须是直接子节点 <view><movable-area style"width: 750rpx;height: 200rpx;background-color: gainsboro;">&l…

Java的数据结构-Map集合

文章目录 Map概述Map常用方法Map遍历元素的方法1.方法一&#xff1a;keySet()2.方法二&#xff1a;entrySet() HashMap Map概述 1、Map和collection没有继承关系2、Map集合以key和value的方式存储数据&#xff1a;键值对key和value都是引用数据类型。key和value都是存储对象的…