- 博客(38)
- 资源 (5)
- 收藏
- 关注
原创 Win平台高精度Sleep实现
获取时间戳GetTickCountWindows平台, 可通过GetTickCount和GetTickCount64获取时间戳。它们底层实现是一样的, 返回值的位宽不同。GetTickCount返回uint32_t,最大值2^32,单位毫秒, 系统运行49.71天必定发生绕回的现象,程序处理不好很容易出问题,不建议使用。 GetTickCount64返回的是uint64_t,5.8亿年左右才绕回,更加直观安全。QueryPerformanceCounter (QPC)Windows平台,可通过Que
2021-12-28 15:52:54
2346
原创 Win平台高精度Sleep实现
获取时间戳GetTickCountWindows平台, 可通过GetTickCount和GetTickCount64获取时间戳。它们底层实现是一样的, 返回值的位宽不同。GetTickCount返回uint32_t,最大值2^32,单位毫秒, 系统运行49.71天必定发生绕回的现象,程序处理不好很容易出问题,不建议使用。 GetTickCount64返回的是uint64_t,5.8亿年左右才绕回,更加直观安全。QueryPerformanceCounter (QPC)Windows平台,可通过Que
2021-12-28 15:47:26
2354
1
原创 Windows实现主进程退出,子进程自动关闭功能
需求:软件功能用多进程实现, 由主进程创建若干子进程, 当主进程崩溃时,创建出来的子进程需要能够自动关闭。方法1:进程通信,子进程检查心跳包,一段时间没心跳包则退出进程。缺点:1.实现起来麻烦。2.不支持第三方的程序,因为别人并未实现这些心跳机制。3.依然存在可能程序有BUG, 子进程卡死不退出的现象。方法2:通过作业对象(Job Object来实现), 作业对象是Windows系统提供的对加入作业的进程做特定限制的内核对象,可以对作业中的进程组统一做时间片分配,
2021-12-27 12:26:50
3723
原创 Windows 进程在指定CPU上运行
Windows系统 让进程在指定CPU上运行; 进程CPU group, affinity设置; JobObject的使用;主进程退出,子进程自动结束的实现
2021-12-27 12:14:24
3614
原创 C++11函数重载最佳实践
参数修饰情形在C++11里,一个类型std::string有以下4种情形。std::string s= "123";// 值const std::string s_c= "456"; // 不可修改的值std::string& s_ref = s; // 引用const std::string& s_cref = s; // 不可修改的引用假如我们实现一个Test函数传入std::string作为参数,我们会遇到以下情形的调用:Test(s);Tes...
2021-08-27 10:48:21
308
原创 c++11 std::enable_if在模板偏特化的妙用
1.模板自动推导功能。先看个例子:在调用TestTemplate函数时, 我们可以在函数后面加上<类型>无歧义地指定调用的版本。结果如下:由于模板参数在函数参数中的位置是固定的,编译器其实可以推导出参数的类型, 这样程序员们就可以不指定模板的类型来调用,代码更加简洁清晰通用,不会出现写错模板类型的错误,如下:模板自动推导是如此的美好,我们要好好地利用它。 在应用过程中, 也引入了一些问题, 有些情况, 编译器发现某些代码满足多个同名函数模板,无法决定特化成哪...
2021-08-06 15:15:58
5622
3
原创 C/C++移位操作
C/C++移位操作1.无符号数移位2.有符号数移位总结1.无符号数移位a.规定移动的位数必须是正整数,并且不得大于或者等于类型的位宽,否则行为不确定。例如:unsigned char移动的位数必须是[0,7]unsigned short移动位数必须是[0,15]unsigned long移动位数必须是[0,31]…b.无论左移还是右移,移出位数范围的丢掉,然后补0. 移动的位数可以是0,结果与原值相同。左移n位等价于乘以2的n次方。 右移n位等价于除以2的n次方。当左移丢掉最左边的1时,在
2021-07-30 15:53:34
2258
原创 C/C++除法与取模运算
1.除法运算。a.全是正数时,截断取整,去掉小数部分。128 / 10 = 12;120 / 10 = 12;119 / 10 = 11;b.当被除数或者除数出现负数时,可以理解成把负号提取出来,再采取上面一样的做法。(-128) / 10 = -(128 / 10) = -12;(128) / (-10) = -(128 / 10) = -12;(-128) / (-10) = - -(128 / 10) = 128 / 10 = 12;2.取模运算。a.全是正
2021-07-30 10:57:42
2628
原创 PTP精确时间协议
Precision Time Protocol (PTP) IEEE 1588PTP 是一种高精度时间同步协议, 在网络通过同步信号周期性对所有节点时钟校正。PTP一般在硬件级实现的,精度更高,常见的是直接在 MAC 层嵌入时间戳, 1588v1能达到亚毫秒级精度,1588v2能达到亚微秒级精度。1588v2本只用于设备间高精度时间同步,随着技术的发展,1588v2也具备频率同步功能。NTP是在应用层软件实现.精度在毫秒级别。同步过程:参考上图,同步过程有以下步骤:sync.
2021-05-04 16:21:56
4016
1
原创 c++数组初始化
c++数组初始化写法1.buf[size] = {0};char buf[4] = {0};上述代码执行以后,整个buf都初始化为0,跟我们大部分人的预想是一样。2.buf[size] = {value}; // value != 0char buf[4] = {1};上述代码执行以后, buf里的值是[0x1, 0x0, 0x0, 0x0]。 可能很多人会认为整个数组都会初始化成0x1,但是实际上不是的。3. 那么我们要把buf初始化成全是0x1, 该怎么写。c...
2021-04-27 11:10:55
6957
原创 sprintf, snprintf, _snprintf, sprintf_s 等的区别
1. int sprintf( char *buffer, const char *format [, argument] ... );如果成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数。例子A:缓冲区足够放下整个字符串char buf[4];int sp_ret;sp_ret = sprintf(buf, "12%d", 3);成功, 返回3, 并且buf里的内容是"123\0" 一共4个字节。例子B:缓冲区不足cha..
2021-04-27 00:32:01
7534
3
原创 std::function用法
1.概述 std::function从c++11开始引入, 主要作用就是把任意的函数调用包装到一个对象里,并且这个对象,可以保存,传递,复制,然后在合适时间地点调用。 std::function是动态绑定的,函数或者类可以通过它实现,不改变任何代码,只需改变构造或者执行时传入的std::function对象就改变行为,类似多态的效果。 2.用法1.声明 std::function<int(int)> fn_half; std::function<int(in
2021-03-16 13:34:56
4096
原创 Ubantu搭建FTP服务器
安装vsftpd : sudo apt-get install vsftpd 配置vsftpd : sudo gedit /etc/vsftpd.conf 默认ubantu里面的每个用户都可以登录ftp服务器,并且每个用户登录进去以后,进入的是各自的home目录。可以添加一行local_root=/home/user/my_ftp_root 强制指定各用户登录进去统一的根目录。 可以通过命令sudo adduser test_ftp增加系统用户来增加ftp登录账户,并且可以设置目录权...
2021-03-04 11:45:00
217
1
原创 Ubantu Windows共享文件夹
新版本的Ubantu与Windows共享文件还是十分方便,只需要在桌面系统右键目录即可实现。 右键目录,属性。弹出以下对话框,有一个Local Network Share项,点击进去就有共享的设置参数。 选择共享此目录,以及是否允许访问者创建删除文件等选项。确认即可。 设置完成后,目录的图标会有所变化,右下角有个绿色圈的共享标志。 完成后,在Windows输入\\ip_address _of_ubantu 即可像访问Windows共享目录一...
2021-03-03 10:12:41
192
原创 Ubantu开机启动QT GUI
打开终端,运行gnome-session-properties命令。弹出以下界面,添加指定路径的qt程序即可。通常开机启动的程序,都伴随着程序崩溃自动重启的需求,gnome-session-properties不支持。因此,使用此方法,需要自己去实现进程监测。 可以添加一个命令行的程序(一般没人去退出它),功能就是简单的打开一个QT GUI程序,并且监测该进程,当进程退出或者崩溃时,自动再启动。...
2021-03-02 21:13:01
870
原创 Ubantu QtCreater生成程序无法双击运行
通过lsb_release -a 命令获取系统版本信息,得知我的系统版本是Ubantu 19.10 编译出来的QT程序,默认是shared library类型,因此不能双击打开,但是在terminal里运行是可以的。 在QT后缀为.pro的项目工程文件里增加一行 QMAKE_LFLAGS += -no-pie 重新编译程序,类型变成executable类型了,这时候双击也可以运行。 ...
2021-03-02 11:10:05
766
原创 好用的批处理
当我们做了一系列的操作,并且可预见我们以后还会重复,那么我们最好以脚本的形式保留下来。在Windows系统批处理通用几乎没有依赖成本的,拷贝就能用。
2021-01-15 15:18:00
1077
转载 读写锁实现参考
import java.util.concurrent.Semaphore;public class ReaderWriterLock { public ReaderWriterLock() { readers = 0; readLock = new Semaphore(1); readWriteLock = new Semaphore(1); } public void writeLock() throws InterruptedException {...
2020-06-17 16:21:26
127
转载 GetAdaptersInfo返回错误码998
转载From:http://www.educity.cn/wenda/351190.htmlGetAdaptersInfo函数在64位系统下返回ERROR_NOACCESS的问题 实际应用中一个程序在长时间运行后内存占用较高时发生崩溃,从dump信息中,发现GetAdaptersInfo函数返回了一个奇怪的错误码998(ERROR_NOACCESS),百度搜索不到相关的信息。MSDN上GetAdaptersInfo函数的错误码正常情况下只有5种。并且一共发生的两次崩溃都出现在一台Win7 64位机器
2020-06-16 16:08:54
1310
原创 visual studio 远程调试
在开发的工程中,不可避免地遇到需要远程调试。例如我们只有目标机才有需要的硬件,又或者只有目标机才有足够性能等。Visual自身的远程调试功能十分强大,几乎与在本地调试没什么区别。你还在反复地改代码,加打印,重新编译,拷贝到目标机,运行看结果,再改代码改打印,重新编译...吗?重复是程序员的万恶之源,快来加入我们远程调试吧! 1.先在visual studio的安装目录搜索 Remote Debugger,找到远程调试工具。如下图。默认应该是C:\Program Files (...
2020-05-18 16:47:19
1777
原创 逐渐摆脱拖延
像你这么出色的男人,躲避是没有用的!这段时间越来越感觉自己的注意力有限,每天疲于奔命,依然是一堆问题等待处理,感觉效率很低,每天都因此过得不快乐。然后不断地去想,问题出在哪,该如何应对。 然后我发现,问题不处理本身可能不是大问题,真正值得我们重视的大问题是,未处理的问题,它会一直占据你的脑海,拖着你,一直吃掉你的注意力和意志力,导致你做其他事情的效率大幅降低,无法...
2020-04-03 11:47:58
137
原创 VS2015编译protobuf3
下载了protobuf3的源码,想在vs2015里使用。里面没有visual studio的工程。 上网了解了一下,可以用CMake工具来生成指定编译器的工程,CMake是一款开源跨平台的软件,写好一份平台编译器无关的配置文件,然后在具体的平台里,自动生成本地的makefile或者项目工程。 下载好CMake, 在Windows有gui界面,选定...
2020-03-31 00:19:31
414
原创 Windows CPU 分组问题
当Windows的CPU核数超过64以后, Windows会自动分组。以下是我在Windows 2016系统测试到的行为:1.一个进程只能绑定一个CPU分组, 线程则没有限制。2.进程设置CPU分组,取决于第一个线程所绑定的CPU分组,这个系统是有一定的记忆但是也是随机分配的, 如果要设置进程到某固定分组,则需要改变第一个线程分组,再设置进程affinitity。3.当设置...
2020-03-26 12:11:13
5227
1
原创 好记性不如烂笔头-开始记录吧少年
记忆力是有限是事实,很多当时搞得很熟,以为自己能记住的事情,一段时间后照样会忘记,这是人的特性,我们无法回避它。我决定接受它,为了弥补大脑的缺陷,通过做笔记的方法,让一些我们认为重要的知识,理解,记录下来,以后能随时在短间里翻出来,这样达到跟我们完全记住比较相近的结果,也是很不错。 之前我有记录一些东西到电脑上,最近经过了一台电脑中了加密病毒,一台电脑无法开机以后...
2020-03-26 11:21:22
160
转载 如何跟踪MFC源码
PDB文件,英文全称:Program Database File。保存着调试和项目状态信息,并且使用这些信息可以对程序的调试配置进行增量链接。当在Visual stido使用 /ZI 或者/Zi方式编译c/c++程序时,将会生成一个以该项目命名的.PDB文件。 如果没有PDB文件,将无法查看堆栈里的具体信息,以及查看源码的功能。 如果我们想跟踪MFC的源码,必须要有相应的P
2013-04-26 01:39:50
1384
原创 Visuals studio 2005项目属性配置要点
要编程开发产品,除了对编程语言的运用外,还需要一个协助你编程的环境。现代的开发工具功能异常强大,方便地重构,代码自动补全,各种调试神器,让你做起事来事半功倍。我是用Visual studio 2005来做开发的,今天猛地发现,原来对这个环境还有很多东西值得我们去探究。Debug 和 Release的区别 Debug顾名思义就是调试版,生成的程序没有经过优化并且包含跟踪需要的调
2012-10-10 15:39:53
984
原创 Windows socket之最简单的socket程序
最简单的服务器的socket程序流程如下(面向连接的TCP连接 ):1. WSAStartup(); 初始化网络库的使用。2. socket(); 获得一个socket。3. bind(); 把获得的socket绑定到一个ip 和端口。既然作为服务器, ip通常为本地IP127.0.0.1。4. listen(); 监听已经绑定了指定端口的socket。5. accept();
2012-02-03 16:17:54
11094
原创 在Windows下配置apache跑fcgi程序
FastCGI程序可以用c++语言来写,使得我们在动态生成一个网站的时候可以更加灵活,除了调用c++库之外,还可以加入平台的API,本来在linux下跑起来的fastCGI程序,没想到移植到Windows平台下还是会出现很多问题,当你抓破脑袋都想不出问题所在的时候,非常打击人的。
2011-10-13 16:51:01
4000
原创 实现类似路由器那样通过WEB页面配置设备
实现通过web来与其他进程交互 要像路由器那样,通过访问一个网页就能配置设备,实质上是web服务器与其他进程的通信问题。关键在于,我们的web服务器收到浏览器的请求时能够通知另外一个进程来处理。通常配置一个设备的程序可以用高级或者低级语言来实现,但是苦于不知
2011-08-19 14:04:52
15821
原创 QT多线程
Qt多线程1.QThread类 QThread类并不是代表一个新的线程,而是QT提供的一个接口,用于控制一个子线程。每个QThread的实例就代表着对一个新线程的一个控制类。对于第一次使用QT多线程的人,或许就会很迷惑很不适应。 QThread提
2011-07-26 16:39:43
11168
1
原创 JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础
<br />这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考。<br />为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问题,特别是乱码问题,我觉得组成一个系列来描述和分析更好一些,包括三篇文章:<br />第一篇:JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础<br />第二篇:JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换<br
2010-11-03 18:32:00
677
原创 QT文本编码
QT中的QString内容使用Unicode作为文本编码。但是实际系统中通常采用的是其他编码,例如GBK,utf8等。为了便于兼容这些格式,QT中还设置了两个字符串类型:QCString类: C类型字符串,必须以0结尾,也就是中间不能含有0. 例如GBK编码的字符串QByteArray类: 中间可以含有0.例如utf8编码的字符串为了便于编码转换,QT还提供了一套具备扩展性的编码转换器:QTextCodec这个类定义了编码转换器的接口,可以以插件方式继承这个类,实现各种编码转换器。当然,QT也内置了多种编码
2010-11-03 11:20:00
6327
原创 Qt Creator使用体会与小技巧(转)
<br /> Qt Creator是Qt官方的IDE,这个IDE为Qt编程人员提供了一个完整的开发环境。当然了,这个IDE是用Qt写的,也是免费的。这个IDE真正的编译部分使用了MinGW gcc compiler。也就是说,这个IDE主要的作用是协助开发人员编写代码,并以更加友好的图形界面方式(而不是命令行)使用MinGW。下面我以MS Visual Studio作为参照,讲一些在Windows平台上Qt Creator的使用体会与小技巧。<br /> <br />1. 工程文件与项目
2010-11-03 10:18:00
917
原创 如何使用VC2005编译“真正”的静态Qt应用程序(转)
如何使用VC2005编译“真正”的静态Qt应用程序(转)2009-10-10 10:30<br />原帖位置: http://www.qtcn.org/bbs/read.php?tid=13825<br />如何使用VC2005编译“真正”的静态Qt应用程序<br />(我非常讨厌引用或者转载别人的文章的时候不注明地址或者作者,希望读者能够改变我这个观点 :) —— 夏威夷雪人)<br /><br />(下文只涉及windows,不谈及linux、unix等,另外,这里说的VC2005,是因为我用的是200
2010-11-03 09:41:00
911
Qt设置窗口图标以及程序图标
2013-04-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人