![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
最爱吹吹风
觉悟
展开
-
代码执行时间统计时钟
代码运行时间统计原创 2022-09-08 18:13:31 · 526 阅读 · 0 评论 -
Windows 异常处理
windows 上的异常处理原创 2022-04-29 16:00:06 · 1669 阅读 · 0 评论 -
PDB 符号文件去除私有符号
PDB 符号文件去除私有化符号,方便给三方调试,又可以有效防止代码被逆向。微软的给用户提供的sdk库符号文件也经过去除私有化的处理,有效的保护了代码信息原创 2022-04-24 20:22:27 · 565 阅读 · 0 评论 -
Timer 定时器
Windows 上原生Timer常用的有下面两个:1. SetTimer windows上最简单方便的定时器,不足之处是要依赖消息循环,不能在工作线程使用。时钟到了会将WM_TIMER放入消息队列,也会收到消息队列中消息数量和消息处理过程影响2.SetWaitableTimer 内核定时器,可以在任何线程使用。精度也较SetTimer高,不过对不同系统这个默认精度不同,可以通过timeBeginPeriod设置,这个在msdn SetWaitableTimer 的介绍中也有提到:SetWaitab.原创 2022-03-24 18:16:32 · 658 阅读 · 0 评论 -
Windows Dpi 缩放
windows dpi 缩放原创 2022-01-08 16:38:28 · 1861 阅读 · 0 评论 -
STL-多线程同步
1. mutex/recursive_mutex最基础的同步工具,需要手动lock/unlock,一般不直接使用,特别对于不可预期的异常情况,可能会导致mutex不能释放2. std::lock_guard/std::unique_lock/std::scope_locklock_guard/unique_lock有些相似,都是在构造中对mutex加锁,析构时释放。不过相对于lock_guard,unique_lock有更多的构造函数重载,所以功能相对强大一些。先看lock_guard:原创 2021-09-14 16:15:17 · 405 阅读 · 0 评论 -
QT-qrc资源管理
QT中对图片、qml资源都是通过qrc来管理的,本质上就是将这些资源通过二进制的方式,放入一个静态数据中,在编译时一块编译到二进制中。这块有两个疑惑,通过qrc加载对应文件时怎么找到对应的二进制数组 不同模块中的二进制资源如果相互引用的问题第一个问题,没有看过源码,但是大致猜测,应该是QT框架维护了一套qrc路径与二进制数组的映射关系,可以在使用qrc资源的地方替换为实际的资源二进制数据第二个是因为QT在编译qrc时不仅生成了二进制静态数组,还生成了初始化资源的接口,同时有一个全局变量,在全局.原创 2021-05-24 15:13:54 · 690 阅读 · 0 评论 -
QQuick-C++操作QML对象
QT官方推荐QML只作为UI编写和UI简单逻辑,C++用来做业务逻辑的方式来分离界面和逻辑。QML中操作C++类或者对象Doc中非常详细,对于C++操作QML有很多隐晦的地方。QML:main.qmlimport QtQuick 2.14import QtQuick.Window 2.14Window { visible: true width: 640 height: 480 title: qsTr("Hello World") Rectangle{原创 2021-04-16 21:29:44 · 1107 阅读 · 0 评论 -
Windows网络状态判断
项目中应用的长连底层是通过socket建立连接的,但是socket并不能及时的感知当前网络的状态,比如网络断开,在iOS上socket并不能立即感知,需要通过心跳等手段来当前是否断开。这一点在Win10上没有,Win10上如果断开网线或者wifi socket都能及时抛出错误,但是网络重新连接成功后并不能及时识别,这就造成了再windows上网络连接之后底层socket连接不能及时去重新建立,这就需要通过上层来通知底层进行重建。有两种方式可以获取windows上网络连接信息:主动获取。通过INetw原创 2021-03-15 14:09:33 · 1937 阅读 · 0 评论 -
自定义输入输出流(istream/ostream)
C++中输入输出流对于读写一些buffer,设备非常容易,比如最常用的文件,管道,串口,网络都可以用这种方式。所以对于一般要自定义流式操作需要了解istream/ostream, streambuf这两个类的用途。这里只用istream也就是输入流举例:istream定义了对设备或者buffer的操作方法,包含的方法有read,readsome, >>这些读取操作 streambuf可以用来继承自定义buffer或者设备的数据读取和缓存方法istream是施加在streambuf上的原创 2021-02-07 20:02:29 · 3393 阅读 · 0 评论 -
C++文件\文件夹压缩-QuaZip
打包压缩文件、文件夹是个比较常见的操作,之前在代码中使用的一直是7z.exe,利用命令行进行打包。现在发现了一个更好的选择,可以跟项目有更高的集成度,QuaZip.QuaZip git:https://github.com/stachenov/quazip.git直接看这个项目,这个项目是用CMake来组织的,所以直接用CMake将项目转为VS工程,因为依赖的了zlib,所以提前准备好zlibZlib :http://www.zlib.net/zlib没有托管在git上,但是主页直接提供了.原创 2020-12-18 14:35:28 · 669 阅读 · 1 评论 -
TensorFlowLite GPU加速
TF LITE支持移动端GPU加速,特别对android端的支持比较丰富。相对android来说,对IOS的支持就有点差了。从给出的文档也能看出,android的文档也比IOS的丰富。TF LITE明确只支持android和ios端,而且在不同的系统上会有不同表现。即便是可以用GPU,也有可能是部分操作可以应用GPU加速,部分依旧在CPU上,这要看具体系统对GPU操作的支持。TF LITE在运行时会给出log引用官方的解释:不支持的模型和 ops如果一些 ops 并不支持 GPU 代理原创 2020-12-02 17:51:20 · 2131 阅读 · 0 评论 -
TensorFlowLite C++移动端接入
TensorFlowLite是专为移动端开发的深度学习框架,这个框架在windows上依然可以使用。编译:TF NoiseSuppression依赖于tf lite库,编译方法: 进入lite目录tensorflow\lite 执行cmake命令编译对应平台的lite库 以win32为例:cmake ../tensorflow/tensorflow/lite -G"Visual Studio 16 2019" -A"Win32",生成一个WIN32的VS项目,cmake在生成原创 2020-12-02 17:41:33 · 833 阅读 · 1 评论 -
boost.asio异步IO在各平台下的实现
basic_socket.hpp中将服务区分为了两种,一种是reactive_socket_service 一种是win_iocp_socket_service,这点跟操作系统类似,unix类系统和windows系统。因为unix上面的异步io用的都是reactor模式,windows的iocp是proactor模式,所以名称也是相对的。iocp不具体说了,只有windows平台下有,有极高的效率,因为io的工作基本系统都已经帮上层做了。参考basic_socket对具体平台的实现定义:#if原创 2020-11-16 20:55:21 · 681 阅读 · 0 评论 -
STL中的字符编码转换
C++工程中编码转换的场景还是很多的,如果用QT工程,QString本身就提供了很多转换的函数,如果是Win32项目,也可以借助WideCharToMultibyte函数进行转换,问题是不能跨平台,这个接口也不方便用。所以利用C++自身提供的库来解决是最好的。#include <iostream>#include <string>#include <locale>int main(){ std::locale loc(""); auto& f原创 2020-10-31 17:06:17 · 742 阅读 · 0 评论 -
C++ 标准输入输出流探索-实现日志模块的流式输出
最近想要做一个日志输出接口,想用类似std::cout这种流式输出方法,研究了一下C++的标准输入输出库 iostream图片摘自cppreferenceios_base,basic_ios不需要过多关注,是一些基础结构和接口定义,基本用不到basic_ostream用于流式输出(std::cout实现自这个类),basic_istream用于流式输入(std::cin实现自这个类),如果想要通过流的方式处理数据就得用到这两个类,iostream是他们两个的合集。basic_ofstr.原创 2020-10-29 18:16:02 · 845 阅读 · 1 评论 -
对称加密-AES-ECB模式
AES作为现在最常用的对称加密方法,主要优点有:运算速度快,加密程度高,内存消耗少。加密模式有:ECB,CBC,CFB,OFB。ECB相对于其他模式,简单,支持并行计算。作为分组加密的一种AES将数据以16字节为一组,对每一组进行同样的加密。可以循环对源数据每一组进行加密,因为ECB模式各分组加密独立,不依赖于上一分组,也可以预先分组好,并行进行加密,然后拼接。因为要以16字节为一组加密,所以如果源数据大小不是16字节的倍数,最后一组数据需要填充,满足16字节。有三种填充方法:padding zer原创 2020-08-28 11:17:38 · 4045 阅读 · 0 评论 -
关于执行异步任务需要注意的几点
异步任务的场景现在已经越来越多,特别是底层的库基本都有自己的线程。方便高效的同时也带来很多问题,线程过多,已经多线程下的问题。在与C++结合的场景中要特别注意的是异步任务在对象销毁前一定要销毁,或者能够保证在异步任务执行结束前当前对象存在。解决方法:在对象析构函数等待异步任务执行完毕,或者停止线程后,等待线程退出。 在对象析构后保证所有的异步任务再不会访问到当前对象的数据(weak_from_this)对于普通的线程模型,第一种方法最为使用,在析构函数中停止线程,并且等待线程退出对...原创 2020-08-10 15:50:31 · 740 阅读 · 0 评论 -
Http: content-type
Http content-type对发送数据的影响原创 2020-07-13 15:54:16 · 243 阅读 · 0 评论 -
三种方法cmd输出重定向(推荐boost.process)
有些场景需要通过执行cmd命令,并且获取返回的结果。有三种方法:boost.process _popen windows1.boost.proeess#include "boost/process.hpp"#include "boost/process/windows.hpp"std::string GetCmdResult(std::string cmd){ namespace bp = boost::process; std::string strResult;...原创 2020-07-03 12:04:59 · 2847 阅读 · 0 评论 -
std::enable_shared_from_this消除异步回调引发的野指针问题
std::enable_shared_from_this这个C++组件完美解决了异步回调发生时宿主对象销毁的问题。C++提供了lambda表达式和各种异步函数,std::thread,std::async或者其他框架api都提供了异步回调方法。特别是lambda在异步应用中实在是太方便了,比如发送一个http请求,接口可能是这样的api::get(url, [](response){ //解析response})。用起来方便,阅读起来也容易理解,但是同时也带来了问题,那就是回调回来的时候宿主类对象...原创 2020-07-01 16:12:44 · 1826 阅读 · 0 评论 -
Mars长连接管理
对长连的管理有两个方面,一个是心跳(HeartBeat),一个是重连(Reconnect)。这两个动作都是有策略性的。一般心跳会间隔性的发出一个很小的心跳包,通过服务端返回来判断连接是否健康。在网络断开会,会自动重连,一般遵循逐渐递增的方法,递增的策略有所不同。在Mars中,对这两个策略有更精细化的管理,在Mars中对App运行的状态分了两种1.前台活动状态(forground-a...原创 2020-04-28 15:41:08 · 1115 阅读 · 0 评论 -
C++17 获取文件最后修改时间
C++17之后又加入了filesystem库,让文件操作也成为了跨平台的存在,文件创建,删除,遍历都不在话下。其他接口都很好用,这里说一下文件修改时间获取时遇到的问题。 std::filesystem::last_write_time可以获取指定文件的最后修改时间,但是获取到的时间是file time,这与systemtime也就是UTC时间不同。 filet...原创 2020-02-29 14:20:14 · 6107 阅读 · 4 评论 -
C++获取当前时间 (std::chrono)
在C++11之前要获取当前时间,大多数情况下要使用C语言的time库:#include <iostream>#include<time.h> #include <sstream>int main(){ time_t now = time(NULL); tm* tm_t = localtime(&now); std::string...原创 2020-02-28 20:25:19 · 47203 阅读 · 0 评论 -
boost.asio网络错误码
对于网络编程,无论是底层socket编程还是上层网络库的编程,正常逻辑往往都非常的简单,重要的是对异常逻辑的把握。比如连接错误,往往都会有很多种。最近项目中用的长连接(TCP)就是基于boost.asio来做的,我们的windows、ios、android都用了这个作为底层网络库。在发生网络错误都会将错误码上报,各平台上报的错误码又不相同,所以深入asio内部查看了一下对于错误码的定义....原创 2019-12-16 10:52:33 · 1283 阅读 · 0 评论 -
Conan让C++项目组件化
随着项目越来越大,很多基础的功能模块需要被拆解出来,单独管理。一方面一些基础模块很稳定,不需要再花团队精力去维护,另一方面有些模块可以供其他项目复用,所以组件化势在必行。项目拆解。将基础模块拆解出来,例如底层网络,bugreport等等稳定,可复用的模块拆解出来。为这些单独模块创建git仓库,单独管理。 为各个项目编写conan脚本,用于在组件代码升级后,自动编译、打包和上传。这些功能con...原创 2019-11-29 16:31:50 · 1543 阅读 · 1 评论 -
C++依赖管理系统-conan
conan官网:https://conan.io/index.htmlconan类似于gradle,maven可以对C++的工程依赖管理,跨平台,并且支持cmake和visual studio,所以对于C++工程的组件化来说就是福音conan是一个客户端,可以像maven一样用一个配置文件来管理C++工程之前的依赖关系,conan可以用来生成,解释,管理这个配置文件。对于自己的项目组件需要...原创 2019-11-27 14:32:33 · 1882 阅读 · 0 评论 -
IM网络层设计
协议层设计flag version command size header body架构设计最底层: socket层,做最底层的TCP连接并且对接协议,包括消息的解包 中间层: 连接管理层, 用于对底层连接做管理。包括连接的ping策略,重连,握手,连接性能统计。 最上层,直接对接业务的一层。包括连接管理层配置信息拉取,日志输出,对外接口等等。问题记录:1. window...原创 2019-11-19 09:36:02 · 338 阅读 · 0 评论 -
nodejs addon
nodejs和C++配合起来,又能满足前端的快速开发,也能达到核心层的性能要求。之前也写过用C++写addon的例子。在实际使用过程也遇到了一些问题:有些场景需要js注册回调函数,供底层调用,这个时候会将回调函数记录v8::Persistent<v8::Function>,实际使用的时候是需要转换为v8::Local<v8::Function>来调用:auto...原创 2019-11-15 19:38:49 · 1478 阅读 · 0 评论 -
boost.asio库编译使用
asio提供了很好的异步网络框架,即便不使用网络,仅仅使用他的异步IO也是很方便的。boost文档中对编译也有说明: b2 --with-system --with-thread --with-date_time --with-regex --with-serialization stage 上面是对asio依赖的一些模块进行了编译,如果不想依赖其他模块,直接使用as...原创 2019-10-25 16:51:02 · 1980 阅读 · 0 评论 -
C++ lambda表达式
C++匿名函数可以捕获外部变量,可以选择按值捕获和按引用捕获。局部变量会遵从这一准则。但是对于全局变量,静态变量,类成员变量则不会,按值捕获不会copy一份在表达式的闭包当中,而是会像引用一样。闭包内使用全局变量或者静态或者换类成员都会受到外部变化的影响,同理,闭包内的变量变化也会影响外部。可以强制按值捕获:假设int p = 1;是一个全局变量,那么强制按值捕获有两种方法,一种是声名局部变量...原创 2019-07-13 16:43:37 · 303 阅读 · 0 评论 -
容器进程(QQExternal)
容器进程的意义在于这个进程并没有指定的功能,他只是负责来加载其他模块(dll),相对于普通进程的优势就是,不用单独去做一个进程,在VS中我们只用关注实现逻辑就好,当需要这个功能单独运行在一个进程中的时候,我们可以方便的用容器进程去加载他,类似于Windows自带的rundll功能。但是我们的容器进程可以有更强大的辅助功能,可以提供进程间通信接口,让多进程编程更加容易。如果关注过QQ的QQExter...原创 2019-07-18 11:03:59 · 544 阅读 · 0 评论 -
字符集转换函数
在unicode和ansi字符集之间的转换,一直用的是windows平台的SHUnicodeToAnsi和MultiByteToWideChar函数。 但是现在C++11也加入了这个功能,用起来也很方便: 代码如下:#include #include int _tmain(int argc, _TCHAR* argv[]){ std::wstring_convert, w原创 2014-12-06 22:50:33 · 767 阅读 · 0 评论 -
VS调试dump
用过VS调试dump的人,都知道UI界面用起来很方便。第一先设置符号和二进制的路径,设置好之后就可以点击使用 仅限本机调试进行调试了,一般来说只要上面两个路径设置好,堆栈会立即显示出来。如果这个时候堆栈还没有显示全。类似下面这样:> Qt5Widgets.dll!5d2a6c00() 未知 非用户代码。无法查找或打开 PDB 文件。 [下面的框架可能不正确和/或缺失...原创 2019-06-17 17:28:29 · 1642 阅读 · 0 评论 -
一个简单的Windows服务程序
#include <iostream>#include <Windows.h>#include <fstream>#include <thread>std::ofstream ofile("D:\\runapp.txt");WCHAR service_Name[] = L"runapp";SERVICE_STATUS ServiceS...原创 2019-05-27 19:28:35 · 396 阅读 · 0 评论 -
QString编码转换
QString是QT中对于字符串的存储和处理的类,类似于MFC中的CString,如果用过的话就知道比std中的string和wstring要好用的多,功能也更强大。QString内部是将字符串保存为Unicode编码的,所以无论传入的字符串是什么编码,都会将其转为Unicode,那有一个问题就需要明确:QString构建的时候是如何知道传入的是什么编码的?这个就要看QString的构造函...原创 2019-05-20 14:58:31 · 11474 阅读 · 0 评论 -
Windows客户端异常收集-BugReport
说起bugreport.exe这个东西,大家应该都不陌生,有时候QQ崩溃或者其他应用崩溃都会看到这个进程在后台启动。其实他就是在主进程崩溃后启动的异常收集程序。他所做的事情大致如下:读取dmp文件,并上传后台,一般会同时上报当前应用版本,崩溃时间,dmp文件md5,等附加信息,方便后台进行管理。dmp文件一般由应用程序在捕获到异常时自己写入。 很多bugreport也包含了错误日志上报的功能...原创 2019-04-19 17:26:47 · 1778 阅读 · 0 评论 -
QT-线程池
在程序逻辑中经常会碰到需要处理大批量任务的情况,比如密集的网络请求,或者日志分析等等。一般会创建一个队列,用一个或者多个线程去消费这个队列,一般也要处理队列的加锁和解锁的问题,除非在设计时就能够做到专列专用,否则锁是不可避免的。而且在入队和出队的操作上肯定还是要加锁,因为他们是在不同线程对同一个资源进行操作。 线程池就是为这个而设计的,比如 Wi...原创 2019-04-19 15:24:20 · 8518 阅读 · 0 评论 -
C++中变量的作用范围(可见范围)
局部变量: 作用域为当前代码块,即{}中。在代码块外部不可见。 静态变量: 局部静态变量,即在代码块中声明的静态变量,作用域为当前代码块,超过该代码块则不可见:static int a = 0;void Test(){ static int a = 0;} 2.类静态成员变量,作用域为当前类,超出类范围则不可见static int a;...原创 2019-07-25 11:33:21 · 3649 阅读 · 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 · 1652 阅读 · 1 评论