如果你正在学习 C++ 或从事 C++ 开发,那么你一定使用过头文件(header file)来实现代码的模块化。然而,在 C++ 早期版本中,头文件带来了很多问题,比如编译速度慢、头文件依赖复杂等等。因此,在 C++20 中引入了一个新的特性...
IE获取元素样式
IE浏览器获取元素样式,通过正常方式获取不了。 这种方法获取不了: CComPtr<IHTMLStyle> pHtmlStyle; if (!FAILED(m_pHtmlElement->get_style(&pHtmlStyle)) && pHtmlStyle != NULL) { if (!FAIL...
beast websocket demo
client: // client.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // include <boost/beast/core.hpp> include <boost/beast/websocket.hpp> include <boost/asio/connect.hpp> include <boo...
visual studio修改堆栈保留大小和提交大小
如果程序中使用的堆栈超过1M(默认)你就需要进行这个设置,但是设置太大又会造成虚拟内存过高。如果你明确的知道哪一个线程使用的 堆栈多高,可以只针对那个线程进行设置,这样不会影响到整个程序。 Qt线程设置堆栈大小...
卸载程序——自删除
问题 卸载程序在卸载的时候怎么把自己给删掉 分析 我们知道在删除文件的时候,这个文件不能被打开,如果是程序那程序不能在运行中。 通常卸载之前我们要求用户先关闭运行中的程序,或者强制杀掉进程,否则删除文件...
datetime封装常用功能
datetime支持windows,linux,异常安全,封装了常见的转换函数,精确到毫秒。 支持常见日期的计算、修改、比较。 pragma once include <string> include <ctime> class DateTime { public: static Da...
boost asio + protobuf封装通信库
方了方便客户端服务端网络部分的开发,使用boost asio和protobuf封装了一个通信库。 特点 - 接口简单 - 高性能 - 自动重连,客户端支持多IP寻址 - 支持心跳 - 包含glog日志库可以直接使用 - 允许设置压缩包 ...
DLL注入和卸载
dll本身是不能运行的,它可以被可执行文件调用来执行,这种是主动去调用dll,反过来也可以将dll注入到指定进程地址空间去执行。 注入程序 使用命令行的方式提供了注入dll和卸载dll两个方法 // inject.cpp : 此文...
Qt QTextEdit文本高亮
QTextEdit支持HTML展示,这样实现高亮就很简单了。 需求 QTextEdit展示了一些信息,增加一个搜索框,搜索时实时高亮出搜索的内容并滚动到最近搜索到的地方。 实现 连接textChanged信号,在onSearchChanged中实现...
C++ 多线程有序锁和无序锁
正常情况下如果多个线程被阻塞,当使用notify_all或者notify_one来唤醒被阻塞的线程时是无序的,你不能知道被唤醒的是哪个线程。当然你可能说我不在意被唤醒的线程是哪一个,但是有些场景需要控制被唤醒的顺序,即:先加锁的线程让它先被唤醒。 首先,这里讨论的不是简单的使...
QWebEngineView支持https
问题 我有个本地网页,里面有https地址的图片,使用QWebEngineView load本地网页后图片显示不出来。 解决 从QWebEnginePage类派生出WebPage类实现certificateError接口,然后将WebPage设置给QWebEngineView。 代码 WebPage代码: // .h class WebPage : publi...
Qt启动第三方控制台程序并读取输出内容
使用QProcess来启动程序,下面使用同步方式来启动: 1. 准备好工作目录,将需要运行的程序放在工作目录下 2. 准备启动的命令行(如果有参数,要拼装好参数) 3. 设置工作目录(很重要) 4. 启动命令 5. 等待执行完成 6. 读取输出结果 代码演示了调用uploadimg.exe工具来...
jemalloc C++实践
jemalloc是一种通用的malloc(3)实现,优点是避免内存碎片和可伸缩并发支持。 下载源码 wget https://github.com/jemalloc/jemalloc/releases/download/5.2.1/jemalloc-5.2.1.tar.bz2 解压 tar -jxvf jemalloc-5.2.1 编译安装 cd jemalloc-5.2.1 ...
C++11 实现defer
defer函数功能还是蛮常用的,它是在出当前作用域的时候执行,用来回收资源非常合适,可惜C++里面没有,以前实现起来都比较别扭现在用C++11实现后看起来简单多了。 此defer内部lambda表达式捕获的是引用; 同一个作用域内先定义的defer后执行; 使用define以及xy连...
Qt json文件读写
Qt提供了处理JSON数据的支持。JSON是一种数据编码格式派生自Javascript,现在在internet上广泛用作数据交换格式。 Qt中的JSON支持提供了一个易于使用的C++ API来解析、修改和保存JSON数据。 它还支持以二进制格式保存数据,这种格式可以直接“mmap”,而且访问速度非常快。 简...
QtCharts使用
QtCharts是Qt的图表模块在Qt5.7版本之后才包含进来的,之前的版本需要下载源码单独编译。 介绍几个重要的类: QChart:Qt图标的核心类,建立在图形视图之上的,管理各个图表部件 QChartView:是一个独立的widget用来展示QChart QDateTimeAxis:日期时间轴 QValue...
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
用新的visual studio 2017或者2019来编译老代码(vs2013),Debug的时候发现QString的toStdString和toStdWString方法触发以上错误(Release没有问题),换成下面两个转换函数就没问题了: std::wstring towstring(const QString& str) { std::wstring result; resul...
多线程锁key处理
目的是要保证多个线程处理同一个key的消息时是线程安全的,同时是顺序的。 1. 收到网络过来的消息,将消息缓存到total msg cache里 2. 解析业务消息找到每条数据的key(可能一条或多条)存储在set中 3. 将所有key进行hash,对最大线程数进行取余,获取所有线程索引std::se...
localtime线程不安全造成的线上问题
线上出现了一个比较奇怪的问题,日期B的时间赋值给了日期A,但是浏览代码发现根本没有这样的逻辑。 经过一番调查基本能确定是localtime函数线程不安全造成的。 下面使用demo来模拟一下出现问题的情况 t1和t2是两个时间,使用GetTimeString转换的时候t2的时间可能会赋...
malloc_trim和SetProcessWorkingSetSize两个神奇的内存相关函数
它们两个其实没有什么关系,相似之处是调用这两个函数后内存会有明显的下降,但是原理完全不同。 malloc_trim linux平台的函数,官方的解释是:从堆释放可用内存。 在程序中堆上new或者malloc的内存我们都会delete和free掉,由于linux的机制它们并没有立即将释放的内存...