C++
土拨鼠不是老鼠
这个作者很懒,什么都没留下…
展开
-
客户端日志模块分析
写了多年的软件,用了众多的日志模块,发现基本的功能是差不多的,结合网上一个大佬自己的写的日志模块,分析下其实现的方式。可以在配置文件中设置,大于设置的才会打印出来。一般日志模块是全局使用的,都会写成单例。在调用的时候会用宏,封装一下。命名,文件大小或者行数 属性必不可少,命名一般按照日期,大小或者行数有默认的设置。初始化时,主要是文件创建,内存开辟,如果时异步 则开一个线程循环从队列取内容。日志存储在哪里,已经命名方式。以上两点,绝对日志存在哪里,叫啥名字,多大限制。主要看两个部分,一是初始化,一是调用。原创 2024-03-18 15:51:20 · 394 阅读 · 0 评论 -
iperf 测试网卡带宽
自己在ubuntu上写了一个udp程序,但是延时很大。用iperf测试下实际带宽能达到多少。反过来,linux作为服务端,windows客户端,可以看到输入的数据。2,要确保 windows 端 和linux 端 版本一致 才能通讯。发现linux 大概以每秒900M左右的带宽在输出。5,nload eth0 看下网卡的接收 和发送。1,iperf 指令有大量参数,可以根据需求配置。3,windows 作为服务端运行。4,linux 作为客户端端 访问。1,windows 安装(2,linux 安装。原创 2024-03-06 12:34:27 · 441 阅读 · 0 评论 -
线程安全的队列
首先对 队列加锁,然后判断当前队列的长度是否大于设定的容量,如果超出则生产者信号量需要阻塞等待,直到消费者 消费了一个,然后继续向下执行添加逻辑。如果不大于设定的长度,则正常向队列添加一个元素,然后唤醒消费者 信号量,取消费。唤醒后,如果此时 消费者或者生产者正在阻塞,则会继续进行,并且检测到了isClose_=false,则会正常退出。如果为空,则说明队列没有元素,消费者等待。这里还有一个函数,用来超时判断,如果队列为空,则等待一定秒数,如果这个时间过后,仍然为空,则直接返回false.原创 2024-03-01 15:00:18 · 501 阅读 · 0 评论 -
线程池学习
这段代码之后,相当于8个线程,从任务队列tasks 中抢任务,抢到一个执行一个。比如A线程 抢到了任务1,任务1 在执行中过程中,由于队列处于未加锁状态,那B线程,就可以继续抢任务2。这里添加完成之后,上述的8个线程就会从这个任务队列中抢任务,然后执行。(3),加锁 确保 ,各个线程对 任务队列(tasks) 不产生竞争,因为添加任务,取任务都要操作这个队列。如果任务队列不为空,则取出第一个任务,队列减1,然后解锁,执行任务,再加锁。如果线程池是退出状态,则跳出当前循环,当前线程也会退出。原创 2024-03-01 11:56:10 · 912 阅读 · 0 评论 -
利用N2N实现内网穿透
这个开源工具,可以达到内网穿透的目的,但是数据要经过服务器,最近发现了N2N这个 p2p工具,同样可以进行内网穿透,并且如果在打洞成功的情况下,数据不经过服务器。安装完改下名字吧,默认是本地连接,我改成了TAP,一会儿配置文件要用。-l 为公网服务器ip,后边的32222端口,为服务器端配置文件中的端口号。下载客户端程序,可以自己用源码编译,也好好多好心人已经提供了编译好的程序(这表明 穿透失败了,查下原因,看下NAT类型。-a 是虚拟网卡的ip,确保要穿透的两个内网机器 在同一个网段即可。原创 2024-03-01 10:14:45 · 873 阅读 · 0 评论 -
C# 通过共享内存调用C++ 算法
比如 C++ 将一个字符串传递给C#,由于他们直接只能使用c接口,传递char* 指针,那必须是C++开辟内存,然后将地址给到C#,但是什么时候清空这个内存 又是个问题。3,双方进行数据交互时,先用4个字节,存入数据的长度,再存入数据内容。上回书说到,将c++算法封装为dll 插件,c++加载后,暴露C风格接口,然后供C#调用。2,C# 在给共享内存传数据时,使用C的memcpy,不使用本身的Marshal.Copy。调用算法时,利用事件进行通知,超时后 将当前图片保存,便于后期查找。原创 2024-02-26 17:39:43 · 543 阅读 · 0 评论 -
分享一个好用的线程安全的c++ 日志库(spdlog)
2,封装成成一个单例模式,在任何需要使用的地方,直接调用即可。线程安全,简单易用的跨平台日志库。1,将源码加到工程中。原创 2024-02-01 16:35:25 · 308 阅读 · 0 评论 -
在arm 64 环境下使用halcon算法
halcon,机器视觉领域神一样得存在,在windows上,应用得特别多, 但是arm环境下使用得很少。按照官方说明,arm下只提供了运行时环境,并且需要使用价值一万多人民币的硬件加密狗才可以运行,但众所周知,我朝盗版软件横行,因此写下了这篇不道德但是使用文章。halcon的运行时环境,包括了所有的so库,但缺少头文件。要想在arm 下编译,头文件,库文件缺一不可,因此需要将 开发环境的头文件拷贝到运行时环境下。具备了头文件和so文件后,再将破解文件进行替换,就可以在arm 下使用halcon算法了。原创 2023-11-23 17:38:51 · 1547 阅读 · 21 评论 -
linux 下 C++ 与三菱PLC 通过MC Qna3E 二进制 协议进行交互
西门子plc 有snap7库 进行交互,并且支持c++ 而且跨平台。但是三菱系列PLC并没有现成的开源项目,没办法只能自己拼接,我这里实现了MC 协议 Qna3E 帧,并使用二进制进行交互。原创 2023-09-06 10:16:56 · 1227 阅读 · 0 评论 -
嵌入式设备 如何运行halcon算法
4,运行版不带 头文件,如果想在linux下编译 halcon算法,可以将开发板的头文件拷贝过来,如(halcon-18.11.4.0-linux.tar)下的头文件。2,插入加密狗后安装对应的软件,比如halcon-18.11.4.0-aarch64-linux-runtime.tar,之后将加密狗带的license 拷贝到安装路径下(/opt/halcon/license)下。5,运行时需要可执行文件同时找到so库和license,可拷贝到运行目录下或者放到环境变量里。原创 2023-06-21 15:14:44 · 1284 阅读 · 0 评论 -
c++ dll 通过回调 调用c# 函数
需求:c++ 封装的dll使用了vtk的窗口,窗口上绘制一点,选中这个点,需要将点的信息,告诉给c#应用。1,定义结构体 于函数指针类型。2,.h 文件中 声明。3,.cpp 中实现。原创 2023-05-22 09:37:47 · 112 阅读 · 0 评论 -
NNG pair 异步通信
三,adapter 端,同步发送数据,单开一个线程 进行数据的轮询接收。3,CMakeLists.txt 两端 基本一致。一,利用NNG pair模式,实现异步通信。原创 2022-11-16 13:09:25 · 1409 阅读 · 0 评论 -
NNG 通信模式
单向通信,类似与生产者消费者模型的消息队列,消息从推方流向拉方。网状连接通信,每个加入节点都可以发送/接受广播消息。请求-应答模式,如果不应答,请求方会一直请求。用于多节点表决或者服务发现。一对一双向通信,类似对讲机。原创 2022-11-16 11:47:50 · 6204 阅读 · 1 评论 -
c++程序 cpu占用过高排查方法
1,执行 top指令 查看当前cpu的整体情况。如下图 31757进程占用cpu最高。2,执行 top -p 31757 -H 指令,查看当前进程下 各线程占用cpu情况。3,执行 pstack 31763 指令,查看当前线程的堆栈信息,定位到具体函数。 备注:pstack 是一个shell脚本。原创 2022-06-01 15:11:44 · 5290 阅读 · 2 评论 -
ubuntu 利用vcpkg 安装grpc
vcpkg 暗转grpc原创 2022-04-25 14:19:22 · 1967 阅读 · 0 评论 -
C++ 死锁及解决办法
定义:死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。例如,如果线程A锁住了记录1并等待记录2,而线程B锁住了记录2并等待记录1,这样两个线程就发生了死锁现象。示例:一,忘记释放锁mutex _mutex;voi...原创 2019-05-27 11:23:39 · 10406 阅读 · 1 评论 -
迭代器模式
一,简介迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。二,角色Aggregate聚集抽象类ConcreteAggregate具体聚集类Iterator迭代抽象类,用于定义得到开始对象、得到下一个对象、判断是否到结尾、当前对象等抽象方法,统一接口ConcreteIterator具体迭代器...原创 2019-07-16 10:26:43 · 141 阅读 · 0 评论 -
单例模式
一,简介单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。二,角色Singleton定义一个GetInstance操作,允许客户访问它的唯一实例。此方法为一个静态方法。主要负责创建自己的唯一实例三,举例实现方式为饿汉模式和懒汉模式。懒汉模式为第一次使用时才创建一个唯一的实例对象,饿汉模式为程序启动就创建一个唯一的实例对象。参考:h...原创 2019-07-16 11:25:50 · 146 阅读 · 0 评论 -
职责链模式
一,简介职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关心。将这个对象连城一条链,并沿着这条链传递请求,直到有一个对象处理它为止。二,角色Handler定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。ConcreteHa...原创 2019-07-18 16:50:54 · 123 阅读 · 0 评论 -
中介者模式
一,简介中介者模式(Mediator Pattern):是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为模式。二,角色Mediator抽象中介者,定义了同事对象到中介者对象的接口ConcreteMediator具体中介者对象,实现抽象类方法,它需要知道所有具体同事类,并从具...原创 2019-07-20 13:37:43 · 135 阅读 · 0 评论 -
桥接模式
一,简介将抽象部分与它的实现部分分离,使它们都可以独立地变化。翻译成人话:实现系统有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让他们独立变化,减少它们之间的耦合二,角色Abstraction抽象RefinedAbstraction被提炼的抽象Implementor实现ConcreteImplementorA具体实现...原创 2019-07-16 15:51:05 · 145 阅读 · 0 评论 -
抽象工厂模式
一,简介抽象工厂模式(Abstract Factory),提供一系列相关或相互依赖对象的接口,而无需指定他们具体的类。二,角色AbstractFactory抽象工厂接口,它里面应该包含所有的产品创建的抽象方法ConcreteFactory 1具体的工厂,创建具有特定实现的产品对象AbstractProductA抽象产品,他们都有可能有两种不同的实现...原创 2019-07-12 12:54:18 · 222 阅读 · 0 评论 -
享元模式
一,简介享元模式(Flywight Pattern)主要用于减少对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。二,角色FlyweightFactory一个享元工厂,用来创建并管理Flyweight对象。它主要用来确保合理地共享Flyweight,当用户请求一个Flyweight时,FlyweightF...原创 2019-07-20 14:36:18 · 169 阅读 · 0 评论 -
解释器模式
一,简介解释器模式(interpreter pattern)提供了评估语言的语法或表达式的方式,它属于行为模式。这种模式实现了一个表达式接口,该接口解释了一个特定的上下文。这种模式被用在SQL解析、符号处理引擎等场合。二,角色AbstractExpression抽象表达式,声明一个抽象的解释操作,这个接口为抽象语法树中所有节点共享TerminalExpression终...原创 2019-07-22 15:29:07 · 120 阅读 · 0 评论 -
命令模式
一,简介命令模式(command),将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。在OOP中,一切都是对象,将请求封装成对象,符合OOP的设计思想,当将客户的单个请求封装成对象以后,我们就可以对这个请求存储更多的信息,使请求拥有更多的能力;命令模式同样能够把请求发送者和接收者解耦,使得命令发送者不用去关心请求将以何种方式被处理...原创 2019-07-23 14:11:10 · 140 阅读 · 0 评论 -
状态模式
一,简介在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。二,角色Context维护一个ConcreteState子类的实例,这个实例定义当前的状态State抽象状态类,定义一个接口以封装与Context的一个...原创 2019-07-23 14:56:14 · 124 阅读 · 0 评论 -
访问者模式
一,简介访问者模式(visitor),表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。二,角色visitor(访问者)为对象结构中每一个ConcreteElement声明一个visit操作ConcreteVisitor(具体访问者)实现每个由visitor声明的操作Element(元素)定义一个ac...原创 2019-07-23 16:20:30 · 183 阅读 · 0 评论 -
观察者模式
一,简介观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。二,角色Observer抽象观察者,为所有的具体观察者定义一个借口,在得到主题的通知时更新自己ConcreteObserver具体观察者,实现抽象观察者所要求的更新接口,以便使本身的状态与主题的状态相协调...原创 2019-07-10 17:40:52 · 220 阅读 · 0 评论 -
建造者模式
一,简介建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。二,角色builder为创建一个Product对象的各个部件指定的抽象接口ConcreteBuilder具体建造者,实现builder接口,构造和装配各个部件Director指挥者,是构建一个使用builder接口的对象三,举例...原创 2019-07-10 16:00:23 · 124 阅读 · 0 评论 -
外观模式
一,简介外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。二,角色Facade外观类,知道哪些子系统负责处理请求,将客户的请求代理给适当的子系统SubSystemOne子系统类集合,实现子系统功能,处理Facade对象指派的任务三,举例一个任务的完成,需要多个子系统共同参与...原创 2019-07-10 14:20:21 · 119 阅读 · 0 评论 -
C++ 流、缓冲区
一,流的概念 C++ 中流是一种数据的载体,通过它可以实现数据的交换和传输。就像水流是一串水组成,人流是一群人组成,C++的数据流就是由一串数据组成的东西。二,输入流与输出流 C++ 中 数据从程序流向屏幕或磁盘文件,称为输出流;从磁盘文件或键盘流入到程序中,称为输入流。三,流分类标准(控制台流)I/O流:对标准输入设备-键盘 或者标准输出设备-显示器 进...原创 2019-05-29 17:42:31 · 2100 阅读 · 0 评论 -
关于vector的 operator[]、at()与迭代器访问
一,边界检查operator[] 不做边界检查,程序会直接退出。 try { vecInt[3] = 5; } catch (const std::exception&e) { cerr <<"error:"<< e.what() << endl; }运行以上代码,程序会终止:at()会做边界检查,可以用t...原创 2019-05-29 13:59:38 · 1053 阅读 · 1 评论 -
C++ 进程间通信
一,C++ 常用进程间通信管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。 命名管道(namedpipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。 信号(Signal):信号...原创 2019-05-31 16:58:30 · 28428 阅读 · 6 评论 -
C++ 异常
一,定义异常是程序在执行期间产生的问题,C++ 异常是指程序在运行过程中产生可预料的执行分支,如除0操作,数组访问越界、要打开的文件不存在。不同于bug,bug是指程序中的错误,是不被预期的运行方式。如野指针、堆空间使用结束未释放。以下情况可产生异常:做除法的时候除数为 0; 用户输入年龄时输入了一个负数; 用 new 运算符动态分配空间时,空间不够导致无法分配; 访问数组元素时...原创 2019-05-31 13:54:11 · 200 阅读 · 0 评论 -
C++ 11 智能指针
shared_ptrshared_ptr多个指针指向相同的对象。shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同的内存。每使用他一次,内部的引用计数加1,每析构一次,内部的引用计数减1,减为0时,自动删除所指向的堆内存。shared_ptr内部的引用计数是线程安全的,但是对象的读取需要加锁。初始化。智能指针是个模板类,可以指定类型,传入指针通过构造函数...原创 2019-05-27 14:02:17 · 361 阅读 · 0 评论 -
C++ 单例模式的几种实现
懒汉模式是在第一次使用单例对象时才完成初始化工作。因为此时可能存在多线程竞态环境,如不加锁限制会导致重复构造或构造不完全问题。饿汉模式则是利用外部变量,在进入程序入口函数之前就完成单例对象的初始化工作,此时是单线程所以不会存在多线程的竞态环境,故而无需加锁。一、 懒汉模式,标准的 ”双检锁“ + ”自动回收“ 实现class Singleton{publ...原创 2019-05-22 14:55:52 · 515 阅读 · 0 评论 -
编程思想(POP,OOP,COP,AOP,SOP) 整理
面向过程(procedure oriented programming) POP 一种以过程为中心的编程思想,分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了面向对象(object oriented programming) OOP 一种编程范式,将数据及对数据的操作行为放在一起,作为一个相互依存、不可分割的整体——...原创 2019-05-08 11:23:34 · 2537 阅读 · 0 评论 -
C++ 类型转换
隐式类型转换:从构造函数形参类型到该类类型的一个编译器的自动转换。#include "stdafx.h"#include <string>#include <iostream>using namespace std;class Person {private: string _name;public: bool compareNam...原创 2019-05-14 11:14:26 · 580 阅读 · 0 评论 -
C++ 容器与迭代器
C++ 中容器被定义为,数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。很简单,容器就是保存其它对象的对象。顺序容器向量vector是一个线性顺序结构。相当于数组,但其大小可以不预先指定,并且自动扩展。它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组。在创建一个vector ...原创 2019-05-14 12:42:54 · 588 阅读 · 0 评论 -
C++ 11常用特性
auto关键字及用法A、auto关键字能做什么? auto并没有让C++成为弱类型语言,也没有弱化变量什么,只是使用auto的时候,编译器根据上下文情况,确定auto变量的真正类型。#include "stdafx.h"#include <string>#include <list>#include <iostream>usi...原创 2019-05-14 16:24:33 · 14467 阅读 · 0 评论