清水迎朝阳
多年windows下c++客户端开发,或多或少踩了很多坑,积累了一些经验
展开
-
使用std::async,解决 枚举窗口时,获取窗口名字的 堵塞 卡住问题
std::async可以用于异步执行任何可调用对象,包括函数、lambda 表达式、函数对象等。它返回一个对象,用于检索异步任务的结果std::async提供了简便的异步编程接口,结合,使得多线程编程变得更加容易和直观。异步执行任务,避免阻塞主线程。提供获取任务结果和处理异常的机制。支持超时等待和延迟执行策略。// 启动异步任务// 在需要时获取结果return 0;原创 2024-07-22 17:33:51 · 59 阅读 · 0 评论 -
std::vector 容器, vec1 按照 vec2的次序排序
需求就是,vec1中,元素按照vec2 中元素排序。原创 2024-05-31 15:34:02 · 164 阅读 · 0 评论 -
c++ 子进程交互 逻辑
隐藏可以子进程自己完成,自己设置为隐藏即可。获得父进程句柄,写入子进程句柄。比如,点击某个按钮,隐藏子进程,显示父进程。父进程处理消息,显示自己。子进程点击后,隐藏自己。原创 2024-02-05 10:21:07 · 1356 阅读 · 0 评论 -
根据文件路径创建所需的 目录
目录一、c语言中,根据文件路径,创建所需的目录二 、根据std::string 路径 创建目录一、c语言中,根据文件路径,创建所需的目录#include <io.h>void mkdirs(char *muldir){ int i, len; char str[512]; strncpy(str, muldir, 512); len = strlen(str); for (i = 0; i<len; i++) { if (str[i] == '/'原创 2021-09-13 18:00:29 · 270 阅读 · 0 评论 -
字符编码格式转换 整理
一、STD 提供的转换规则#include <codecvt>std::u16string to_utf16(std::string str) // utf-8 to utf16{ return std::wstring_convert< std::codecvt_utf8_utf16<char16_t>, char16_t >{}.from_bytes(str);}std::string to_utf8(std::u16string str1...原创 2021-09-13 17:47:47 · 90 阅读 · 0 评论 -
c++ 知识点 去除路径中特殊字符 及相应的std知识点
目录一、去除空格1、方法一 ,适用于纯英文1、erase 删除范围2、std::find_if3、std::not14、std::not25、去除前面的空格2、方法二 ,也适用于汉字二、去除字符串中的特殊字符一、去除空格1、方法一 ,适用于纯英文缺点 实测字符串有中文时 崩溃#include <functional> // std::not1#include <algorithm> #include <cctyp..原创 2021-09-09 15:20:54 · 334 阅读 · 0 评论 -
临界区 lock锁,多线程下,共享资源的访问策略
多线程中,各个线程都要对共享变量进行操作,比如一个线程对共享变量进行写操作,一个线程对共享变量进行读操作。这时候就可能会有chongtCRITICAL_SECTION 临界区原创 2021-06-16 15:35:51 · 296 阅读 · 0 评论 -
SHGetFolderPath 获得系统指定路径
https://docs.microsoft.com/zh-cn/windows/win32/api/shlobj_core/nf-shlobj_core-shgetfolderpatha?redirectedfrom=MSDN获得AppData路径、std::wstring GetXnwSysAppDataDirW() { static std::wstring utf8AppDataDir; if (!utf8AppDataDir.empty()) { return utf8AppD原创 2021-05-20 14:39:21 · 856 阅读 · 0 评论 -
EnumWindows 枚举所有顶层窗口
目录一、EnumWindows介绍二 枚举所有窗口,并将窗口信息,放置在列表中2.1 窗口信息2.2 枚举函数2.3 枚举窗口,传入参数一、EnumWindows介绍BOOL EnumWindows( WNDENUMPROC lpEnumFunc, LPARAM lParam);lpEnumFuncType:WNDENUMPROCA pointer to an application-defined callback functio...原创 2021-03-22 11:50:51 · 2440 阅读 · 1 评论 -
STL 之 结构体查找及排序的简单书写方式
STL 实用知识STL 之 vector容器使用总结STL 之 vector使用std 之 map 使用总结STL 之map set使用前言stl中,提供了查找与排序的算法,但是如果容器中是结构体的话,虽然查找,排序的方式很多,但是本文只介绍一种简单的方式。大多情况下,不必要那么复杂,毕竟简单的能实现的话,还是简单处理的好。因为使用std::find std::sort ,所以需要加入头文件 #include<algorithm>...原创 2021-01-14 14:08:12 · 291 阅读 · 0 评论 -
STL 之 vector容器使用总结
1获得容器最后一个元素------ 使用 back或rbegin 取得 // back、rbegin 有常量和引用两种形式 std::vector myVector; myVector.back()=3; std::vector::reverse_iterator tailIter; tailIter=myVector.rbe原创 2011-12-07 12:50:24 · 7562 阅读 · 0 评论 -
STL 之 vector使用
vector是估计使用场景最多STL容器了,本文从实际项目中,抽选vector实际应用例子。不关注于繁冗用法,而是关注于实际经典应用例子,在实例中讲解基础用法一、交换vector中两元素 假设容器中没有重复的元素 容器中,保存的是指针,现在的需求是,给出两个指针p1, p2, 在容器中,交换这两个指针的位置 std::vector<Control*> m_items; 交换思路: 1.1) 首先,判断容器中是否包含...原创 2020-10-16 17:51:01 · 127 阅读 · 0 评论 -
std 之 map 使用总结
map 是一种关联容器, 提供一对一的关联, 关联的形式为: KEY----VALUE 关键字不重复。multimap与map类似,但是允许关键字重复 即:关键字和与之对应的值 关键字起到索引的作用, 在map中查找记录 就是根据关键字查找 关键字 和 值 可以是任意类型原创 2013-05-17 14:00:12 · 4646 阅读 · 0 评论 -
STL 之map set使用
序map set底层使用的数据结构为红黑树,一种自平衡二叉查找树,查找、插入、删除时间复杂度为O(log n),非常高效1关联容器概念 vector list deque queue stack序列容器 map set关联容器 1.1关联容器序列容器区别 两者的区别不是其存储方式,比如顺序存储、链式存储 而是根据什么来进行访问和操作。 1.1.1序列容器 不...原创 2020-10-16 17:49:20 · 145 阅读 · 0 评论 -
c++ 小知识点 初始化列表、 为什么析构函数声明为虚函数、为什么构造函数不能声明为虚函数、 虚继承的作用
1 初始化列表作用 1)初始化常量参数 常量成员不能在构造函数中赋值,只能使用初始化列表 class A{public: const int nIndex; A(int i) { nIndex=i; //编译不通过 错误 常量不能再构造函数中初始化 }}class A{public原创 2021-04-08 14:56:11 · 130 阅读 · 0 评论 -
c++小知识点-数组初始化、字符串长度、COLORREF 变量赋值、 float保留两位小数、去除无效文件名字符
1 数组初始化int a[]={1,2,3}; 这种方式初始化,大括号里写了几个元素那么数组里就有几个元素,相当于int a[3]={1,2,3}int a[3]={0}; 这样是将a中的所有元素初始化为0;int a[4]={1,2}; 这样是将a[0]初始化为1,a[1]初始化为2,其他的初始化为0memset(lpBuffer,0,sizeof(lpBu...原创 2020-01-10 11:20:51 · 416 阅读 · 0 评论 -
c++ 小知识点之 路径最后是否有分隔符\\、系统路径、二维字符串数组、time、换行符
1 判断最后一个是否为文件分隔符 string strPath; strPath += path; char lastChar = strPath.back(); if (lastChar != '/' && lastChar != '\\') strPath += "/";2 获得系统特殊路径string GetDefaultVide...原创 2021-01-25 18:27:07 · 388 阅读 · 0 评论 -
c++ 小知识 重新运行、编译重定义问题、隐藏控制台、控制台添加ICON、 当前时间
1 、重新运行程序 程序崩溃、或 注销换个用户,重新登录 很多程序这么处理的,就是结束本进程,重新打开这个进程 重新打开进程用的shellexecute 比如: 重新运行程序RestartApp(const std::wstring &cmd){ wchar_t app[1024] = { 0 }; Get...原创 2018-09-12 17:49:16 · 234 阅读 · 0 评论 -
c++小知识点 字符串、 lstrlen、 查找 strstr、wcsstr、 _tcsstr 、 复制 lstrcpy 、读取格式化字符串、string wstring 转数组
1 字符数组 字符串字符串常量 字符指针变量 的区别字符数组: 数组中每一个元素保存的是字符, 不一定以/0为结尾。字符数组初始化:char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'};字符串: 字符数组与字符串的唯一区别是,字符串的末尾有一个空字符 ‘/0’字符串数组初始化:原创 2021-04-08 15:03:50 · 373 阅读 · 0 评论 -
c++ 小知识点-随机数、静态函数、类静态变量、全局变量、callback 、File 文件长度
1 设置随机数#include #include #include using namespace std; int a[50]; srand((unsigned)time(NULL)); for (int i=0;i<50;i++) { a[i]=rand()%100; }或#include "time.h" srand( (unsig原创 2012-05-08 17:14:53 · 1289 阅读 · 0 评论 -
C++ 小知识点 格式化字符串、获得扩展名、时间戳、删除、重命名rename
static string ResString(uint32_t cx, uint32_t cy){ stringstream res; res << cx << "x" << cy; return res.str();}原创 2021-02-07 16:17:15 · 200 阅读 · 0 评论 -
c++ 知识点 路径及 路径解析
c++ 小知识 重新运行、编译重定义问题、隐藏控制台、控制台添加ICON、 当前时间c++ 小知识点之 路径最后是否有分隔符\\、系统路径、二维字符串数组、time、换行符c++小知识点二-数组初始化、字符串长度、COLORREF 变量赋值、 float保留两位小数、去除无效文件名字符c++ 小知识点 单例模式、相对路径转绝对路径c++ 小知识点 初始化列表、 为什么析构函数声明为虚函数、为什么构造函数不能声明为虚函数、 虚继承的作用C++小知识点 &&的优先级高....原创 2021-04-08 17:01:38 · 235 阅读 · 0 评论 -
c++ 之JSON 应用示例及源码
文章目录系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言本文所采用的C++ JSON :https://github.com/open-source-parsers/jsoncpp一、如何在自己项目中加载JSON库1.1 所需头文件及lib库头文件:lib库在本文最后,会给出一个简单示例1.2 配置项目1) 添加 include文件夹位置..\jsoncpp...原创 2021-01-19 16:35:37 · 353 阅读 · 0 评论 -
c++ 知识点 : 线程相关
1、线程开始事件、线程结束事件、WaitForMultipleObjects 控制线程 假如线程是无限循环的,需要从线程外部控制线程结束 //用于线程管理的两事件 //HANDLE CreateEventA( // LPSECURITY_ATTRIBUTES lpEventAttributes, // BOOL bManualR...原创 2018-09-18 12:08:40 · 366 阅读 · 0 评论 -
c++ 知识点 std::function 使用
这是c++11新添加的,头文件#include <functional>官方说明:Class templatestd::functionis a general-purpose polymorphic function wrapper. Instances ofstd::functioncan store, copy, and invoke anyCall...原创 2018-09-20 18:50:43 · 46669 阅读 · 7 评论 -
c++ 知识点 大小不断调整的内存空间
再做音频数据发送时,遇到这样的情况接口只接受10ms的数据量,不是10ms数据量的整数倍,接口调用不成功因为一次获得的数据,有可能不满足发送条件,所以需要和后面的叠加,而发送成功后,有需要将发送出去的内存空间释放,同时保留剩余未发送出去的数据方式1一开始想用 new delete ,可是没有类似realloc这样重分配内存空间的函数,所以还是用malloc free...原创 2018-09-21 10:49:40 · 452 阅读 · 0 评论 -
c++ 知识点 : 定时器
MFC 直接使用setTimerc++ 中,也有类似的定时器:CreateWaitableTimer、SetWaitableTimer 其实是windows API官方文档:https://docs.microsoft.com/zh-cn/windows/desktop/api/winbase/nf-winbase-createwaitabletimeraCreateWai...原创 2018-09-21 19:06:38 · 287 阅读 · 0 评论 -
c++ 知识点 callback
主程序中,调用了第三方库,或类,第三方库,需要实时传递给主程序数据,供主程序处理这种情况下,用回调解决就非常合适了回调:传递函数参数地址 到另一个库,另一个库有调用该函数, 这样在该回调函数中处理数据。主程序端1)主程序的 回调函数,想在此函数中处理数据int sendSelfAudoDataCallBack(const char* buf, in...原创 2018-09-26 12:15:45 · 3445 阅读 · 1 评论 -
c++必备知识 之 浅析回调及应用示例
回调回调在实际大程序中,是几乎肯定要用到的,主要用于两个不需要耦合的类间传递信息使用。本文主要梳理回调的使用场景,及使用方式:全局函数、静态成员函数、非静态成员函数下设置回调的方式目录回调什么是回调?一、一个简单的示例二、设置回调的几种方式2.1 全局函数2.2静态成员函数2.2非静态成员函数1)接口是函数指针 2)接口是std::function 什么是回调?假设:有一个摄像机,摄像机只负责采集数据,有一个显示器,...原创 2020-12-29 18:30:55 · 187 阅读 · 0 评论 -
C++ 发送请求 及服务器响应 机制梳理
一客户端向服务器发送请求1)原理HTTP 请求报文格式HTTP请求报文的一般格式由4部分组成:请求行、请求头部、空行、请求数据。如下图所示:请求行:包含3部分内容:请求方法,URL,协议版本。请求头部:以key/value形式成对表示头部参数,以英文冒号分隔空行:用来标识请求头部的数据已结束。请求数据:可选项,这块内容只在POST方式下使用,作为POST的数据表示区域。使用这块内容,要在请求头部以Content-Length声明请求数据长度,以Content-...原创 2020-09-18 11:24:58 · 852 阅读 · 0 评论 -
c++ 知识点 : 动态定义数组
首先:为什么需要动态定义数组呢? 这是因为,很多情况下,在预编译过程阶段,数组的长度是不能预先知道的,必须在程序运行时动态的给出 但是问题是,c++要求定义数组时,必须明确给定数组的大小,要不然编译通不过 如: int Array[5];正确 int i=5; int Array[i]; 错误 因为在编译阶段,编译器并不知道 i原创 2008-11-17 16:46:00 · 24443 阅读 · 1 评论 -
c++ 智能指针示例 总结
很多理论介绍的很好了,但看了后还是难以下手。有时候实际的例子更有代入感,本文主要介绍项目中实际的智能指针应用例子。一 局部函数中使用几乎所有资料,介绍的都是智能指针在局部函数中的使用0)直接定义方式整形智能指针 unique_ptr<uint8_t> bits(new uint8_t[size.cx * size.cy * 4]).........原创 2019-12-23 17:15:13 · 574 阅读 · 0 评论 -
遍历某路径的函数 ---- 将路径下 所有的文件保存在全局容器中,以待近一步处理
//全局容器 存放所有查到的文件路径std::vector g_xmlFilePath;// 执行完毕后,路径下所有的xml文件路径 都保存在全局容器g_xmlFilePath中了FindFileInDir(CString filePath){ std::vector directoryPath; CString subfilePathtemp;...原创 2011-11-23 09:53:58 · 1082 阅读 · 0 评论 -
程序中调用CMD,运行命令或启动子程序
首先,需要注意的是,CMD 是以空格来区分参数的,如果路径或参数中带有空格,可以将路径或参数 用双引号括起来处理一、打开本地视频文件示例本示例是QT示例,QT 提供了QProcess,可以用来执行CMD命令假设,要用默认播放器打开"E:\\视频文件\\2_2021-02-07_14-20-16.flv可以直接这么写: QString run_path = "cmd /c " + filePath_; QProcess *p = new QProcess(this)...原创 2021-02-08 16:58:51 · 928 阅读 · 0 评论 -
进程通信
子进程需要做的工作:第一步:记录主进程窗口句柄1)定义父进程句柄为方便使用,可在stdafx.h中 定义全局变量// 进程通信extern long m_hParentWnd;extern bool g_bInited; //有时候重启2)子进程窗口初始 1、将子进程句柄记录到文件中 2、获得父进程句柄 //记录子进程句柄 std::wstring iniPath...原创 2018-07-10 15:15:44 · 198 阅读 · 0 评论