C/C++
文章平均质量分 86
Louis_815
我很懒,我是小菜鸟
展开
-
C++(20):线程池的实现和使用
线程池作用线程池能够减少创建的线程个数,线程池的出现着眼于减少线程本身带来的开销线程池适合场景(1)单位时间内处理任务频繁而且任务处理时间短(2)对实时性要求较高。如果接受到任务后在创建线程,可能满足不了实时要求,因此必须采用线程池进行预创建。实现代码代码来自github上的一位大神,只用一个简单的头文件就实现了线程池:https://github.com/progschj/ThreadPool#ifndef THREAD_POOL_H#define THREAD_POO...转载 2021-07-30 18:09:33 · 413 阅读 · 0 评论 -
卡尔曼滤波经典讲解,C++算法实现(转载)
在学习卡尔曼滤波器之前,首先看看为什么叫“卡尔曼”。跟其他著名的理论(例如傅立叶变换,泰勒级数等等)一样,卡尔曼也是一个人的名字,而跟他们不同的是,他是个现代人! 卡尔曼全名Rudolf Emil Kalman,匈牙利数学家,1930年出生于匈牙利首都布达佩斯。1953,1954年于麻省理工学院分别获得电机工程学士及硕士学位。1957年于哥伦比亚大学获得博士学位。我们现在要学习的卡尔曼滤波器...转载 2020-03-03 16:20:25 · 1950 阅读 · 1 评论 -
C语言如何获得精确到毫秒的时间
在做测试或性能优化时,经常要知道程序运行的时间,在Linux系统可以使用time命令来计算程序运行运行所消耗的时间,能精确到毫秒,如果要精确到代码块或某个操作运行时所消耗的时间,time命令就不给力了。如果对时间的精度要求不高的话,可以调用标准C的接口time来得到开始和结束的时间,再调用difftime接口来计算时间差,精度是秒,代码如下所示:下载: time.c#inc转载 2017-03-13 11:42:53 · 455 阅读 · 0 评论 -
音视频聊天开发: 4 UDP封装后的调用
上文提到的UDPSocket,只是一个简单的socket封装,被动地调用。本文仿照MFC的CAsyncSocket方式做一个包装调用,不过事件响应采用select,不用MFC的窗口消息。 简单接口如下:typedef void (*udp_data_cb)(int sockid, char *data, int len, int ip, int port, int times转载 2017-03-21 14:28:14 · 417 阅读 · 0 评论 -
音视频聊天开发: 3 UDP的简单封装
视频的采集显示以及编码解码都实现了,下一步就要考虑把数据发出去,由其他客户端播放(设计是先做网络传输,一切都正常后再做音频,虽然叫音视频聊天,其实网络才是最重要的部分)。这里使用UDP进行发送和接收。 考虑到音视频聊天,需要支持iOS,Android等多平台,所以尽可能采用公用方法,下面是简单的一个封装:///////////////////////UDPSock.h:转载 2017-03-21 14:27:39 · 1076 阅读 · 0 评论 -
音视频聊天开发: 2 视频编解码并显示
前面说到了视频采集和显示,显示使用的是GDI,小画面没问题,如果画面放大变失真比较严重。如果要显示的好的话,可以用dshow内置的预览功能。或者使用d3d,opengl显示。这是以后的工作,当前还是继续实现主要功能。 本文主要以实现视频的编码和解码为主。 参考ffmpeg源码中所带的例子,见:doc\examples\decoding_encoding.c。原转载 2017-03-21 14:27:03 · 669 阅读 · 0 评论 -
音视频聊天开发: 1 视频采集
一整套音视频聊天项目,一般包括:视频采集-->编码-->传输-->解码-->播放声音采集-->编码-->传输-->解码-->播放传输部分,还分P2P和中转。因为还要加一些指令,实时消息,相当于一个完整的IM再带上语音视频功能。最近整理一些以前做的资料,发现整理成一个完整的项目更有效,否则一堆一堆零散代码沉积下去就成泥沙了。这里以最简单的实现方式,完成一个音视转载 2017-03-21 14:24:20 · 673 阅读 · 0 评论 -
COleDateTime类型的应用
使用COleDateTime类1) 获取当前时间。 CTime time; time = CTime::GetCurrentTime();2) 获取时间元素。 int year = time.GetYear() ; int month = time.GetMonth(); int day = time.GetDay();转载 2017-02-24 10:04:08 · 893 阅读 · 0 评论 -
MFC的COleDateTime类使用
MFC的COleDateTime类使用经常在软件开发中用到计算执行某个功能的耗时,有必要深入研究下COleDateTime类,以备不时之需。闲话少叙,书归正传,下面我们就一起来看看,该如何使用这个类。下面文字基本是翻译msdn内容,以求增强理解。COleDateTime类是没有基类的,它封装了MFC的DATE数据类型,并提供了一系列的方法,来操作DATE结构体中的信息。DATE数据转载 2017-02-28 14:16:22 · 7266 阅读 · 0 评论 -
类似截图,自己参考
CDC *pdeskdc = GetDesktopWindow()->GetDC(); CRect re; //获取窗口的大小 GetDesktopWindow()->GetClientRect(&re); CBitmap bmp; bmp.CreateCompatibleBitmap(pdeskdc , re.Width(转载 2016-12-22 17:18:33 · 294 阅读 · 0 评论 -
Bitmap 文件结构
BMP文件相关的技术文档,网上可以找到太多了,但这些文档都只适合专业的人去看,所以我写了这篇貌似菜鸟能看懂的文章,但愿它不只是貌似而已。阅读本文前最好先看看《颜色的RGB数字表示方法》什么是位图计算机能以位图和矢量图格式显示图像。位图(Bitmap)图像又称点阵图或光栅图,它使用我们称为像素(象素,Pixel)的一格一格的小点来描述图像。计算机屏幕其实就是一张包含大量像素点的网格。当我转载 2016-12-21 13:48:16 · 3292 阅读 · 0 评论 -
音视频聊天开发: 5 UDP发送视频数据的分包和重组
这里主要用UDP来发送视频,当发送的数据大于1500时分包发送,保证每包小于1500.发送好办,分割后循环发就可以了,关键是接收时的处理。先做一下处理的方法 :发送时每包上面加上标识,比如RTP的做法是加时间戳,SSRC,媒体类型还有结束标识。简单参考一下,我们也加上一些标识(直接拿RTP头也可以, 不过我们的目标是更简洁一些)。另外,我们的目的和RTP稍有不同,UDP库当时设计是传输转载 2017-03-21 14:28:46 · 1317 阅读 · 0 评论 -
音视频聊天开发: 6 简单的stun server
说是stun server,其实只是用了一下名字,和开源的stun server不是一回事,这里还加了一些其他功能。功能: 1 用户通过客户端登录上来,返回它的公网IP和端口。2 为了开发方便,同时记录下客户端的公网IP端口,以及它提交上来的本地IP和端口,以供查询。(这部分功能正常来讲应该单独做成一个服务,比如IM Server)3 用户查询其他用户的公网IP和内网IP(用户拿到转载 2017-03-21 14:29:12 · 1811 阅读 · 0 评论 -
几种常见的设计模式(含C++代码)
本文部分转载于https://blog.csdn.net/hechao3225/article/details/71366058本文介绍几种常用的设计模式并给出C++实现。1.单例模式作用:保证一个类只有一个实例,并提供一个访问它的全局访问点,使得系统中只有唯一的一个对象实例。应用:常用于管理资源,如日志、线程池实现要点:在类中,要构造一个实例,就必须调用类的构造函数...转载 2019-05-31 16:48:53 · 1128 阅读 · 0 评论 -
用Visual C++轻松实现报表处理
用Visual C++轻松实现报表处理作 者:王骏前言 数据库在企业软件系统中应用广泛,而报表的显示与打印成为此类软件必备的功能。可惜VC++并没有集成报表处理工具,但其强大的功能再加上市面上功能完备的报表处理工具使这一工作变得容易,本文介绍了在VC++环境中利用Seagate公司的Crystal report(水晶报表)来实现报表的显示与打印,并提供示例代码。 一转载 2017-05-10 13:40:55 · 1020 阅读 · 0 评论 -
如何根据用户名生成注册码
现在网上下载的软件大部分都需要注册后才能使用其全部的功能,也就是说当前大部分软件都是建立了注册机制的,对于一个刚进入软件行业的程序员来说一定非常想了解其中的注册机制是怎样实现的。其实用VC开发软件,是可以很方便地加入注册机制的。 要实现软件注册功能,首先需要知道实现注册机制要涉及到的几个问题:1、如何加入注册检测,判断软件是否注册;2、如何生成注册码,如何保证一个用户名只生成与之唯一转载 2017-05-05 10:09:19 · 2259 阅读 · 0 评论 -
关于Http协议的get方法和post方法的区别和用法
(一)get方法和post方法简介 查看了MSDN,并且实际写了一番程序,才明白get方法和post方法的不同。其实二者实现的功能相同,都是客户端提交数据库给服务器端,只是实现的机制不同而已。get方法实际上就是通过网页的URL地址实现数据的传送,而服务器端实现从URL地址中解析数据;而post方法则是通过表单的方式提交,数据采取加密方式传送,服务器接到请求后解析数据。从安全角度上看,转载 2017-03-16 11:52:10 · 1012 阅读 · 0 评论 -
Windows消息机制详解
文章转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/18/90412.html,感谢原作者。消息是指什么? 消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉。一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改转载 2017-03-14 10:36:23 · 318 阅读 · 0 评论 -
GetDesktopWindow之MFC窗口全屏显示
void CFullScreenDlg::FullScreenView(void){RECT rectDesktop;WINDOWPLACEMENT wpNew;if (!IsFullScreen()){// We'll need these to restore the original state.GetWindowPlacement (&m_wpPrev)转载 2017-03-14 10:16:45 · 1523 阅读 · 0 评论 -
NAT穿透原理
nat穿透原理 一直以来,说起NAT穿透,很多人都会被告知使用UDP打孔这个技术,基本上没有人会告诉你如何使用TCP协议去穿透(甚至有的人会直接告诉你TCP协议是无法实现穿透的)。但是,众所周知的是,UDP是一个无连接的数据报协议,使用它就必须自己维护收发数据包的完整性,这常常会大大增加程序的复杂度,而且一些程序由于某些原因,必须使用TCP协议,这样就常常令一些开发TCP网络程序的转载 2017-03-23 09:54:23 · 511 阅读 · 0 评论 -
音视频聊天开发: 7 Android下ffmpeg+x264编译
Android下视频的采集和播放直接调用sdk就行了,只是编解码麻烦一些,这里采用NDK编译ffmpeg然后通过JNI接口调用。 Android开发是麻烦了一点,不过手机倒是卖的很多,好在底层还要用的是Linux, 可以使用c/c++开源项目,比如 ffmpeg, vlc等拿上来用。否则直接就是WP7下场。再说android编译ffmpeg,随便一搜有很多文章,不过转载者不知道自己测转载 2017-03-21 14:29:50 · 675 阅读 · 0 评论 -
win32打印机控制,API打印操作
#include #include //这个函数用于读取bmp图像文件,用于给打印机打印的时候使用 //info是位图信息结构 //file是文件名 //dib_ptr是位图rgb像素数据指针,输出用的,所以请提供一个void** bool read_bmp(BITMAPINFO& info, const char* file, void** dib转载 2016-11-28 13:35:53 · 8220 阅读 · 0 评论 -
VC 获取打印机与打印作业的状态
#pragma comment(lib, "winspool.lib")#include "stdafx.h"#include #ifndef _MAX_PATH#define _MAX_PATH 260#endifTCHAR m_tchPrinterMessage[_MAX_PATH];/// /// 获取打印作业的状态BOOL转载 2016-11-28 13:30:12 · 2516 阅读 · 0 评论 -
SetWindowsHookEx 详解(二)
类型: WH_FOREGROUNDIDLE值 11,回调参数如下ForegroundIdleProc callback functionAn application-defined or library-defined callback function used with theSetWindowsHookEx function. The system转载 2016-09-27 14:21:54 · 600 阅读 · 0 评论 -
SetWindowsHookEx详解(1)
SetWindowsHookEx functionInstalls an application-defined hook procedure into a hook chain. You would install a hook procedure to monitor the system for certain types of events. These events ar转载 2016-09-27 14:20:44 · 764 阅读 · 0 评论 -
进程间传递钩子消息时无法收到参数的问题
MOUSEHOOKSTRUCT structureContains information about a mouse event passed to a WH_MOUSE hook procedure, MouseProc.SyntaxC++Copytypedef struct tagMOUSEHOOKSTRUCT { POINT转载 2016-09-27 14:12:43 · 673 阅读 · 0 评论 -
查找子串函数
void Safe_Memstrstr( char* membuf,int memLen,const char* findstr, int FindNum,char* &findPtr){ findPtr=NULL; int lenFlag=FindNum; if (findstr==NULL||lenFlag==0) { return; } const cha转载 2016-08-09 10:31:28 · 637 阅读 · 0 评论 -
指针函数和函数指针
1、指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针 类型标识符 *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。表示:float *fun()转载 2016-08-11 15:57:21 · 389 阅读 · 0 评论 -
消除不用参数的警告信息
UNREFERENCED_PARAMETER(pVoid);原创 2016-08-09 16:55:55 · 598 阅读 · 0 评论 -
虚函数表
一,什么是虚函数简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略,虚函数是C++ 的多态性的主要体现,指向基类的指针在操作它的多态类对象时,会根据不同的类对象,调用其相应的函数,这个函数就是虚函数。下面我转载 2016-08-09 16:27:10 · 383 阅读 · 0 评论 -
虚函数
C++支持编译时多态和运行时多态,运算符重载和函数重载就是编译时多态,而派生类和虚函数实现运行时多态。 只有当基类指针指向子类对象时,才显现多态性,根据指针指向的不同,调用不同对象的虚函数。 虚函数与重载函数的区别: 1)重载函数之间必须在参数的类型或者数量上加以区分,而重新定义的虚函数在参数的类型和数量上必须与原型相同; 2)在定义虚函数的类中,虚函数必须声明原创 2016-08-09 15:33:38 · 448 阅读 · 0 评论 -
C++类中必须用初始化表初始化的数据成员
必须用初始化表初始化的数据成员:1、const修饰的成员变量;2、引用类型的成员;3、类对象成员(类对象的数据成员为私有成员) 拷贝构造函数参数为const引用类型;static类型的数据成员为静态成员, 他的特点是: 无论对象创建了多少个, 该数据成员的实例只有一个, 会被该类所创建的所有对象共享, 其中任何一个对象对其操作都会影响到其他对象。该类型的数据初始化是放在类外原创 2016-08-09 15:22:14 · 1218 阅读 · 0 评论 -
SetWindowsHookEx 详解(四)所有结构体
MOUSEHOOKSTRUCT structureContains information about a mouse event passed to a WH_MOUSE hook procedure, MouseProc.SyntaxC++Copytypedef struct tagMOUSEHOOKSTRUCT { POINT转载 2016-09-27 14:25:06 · 1527 阅读 · 0 评论 -
visual studio 2013 快捷键大全、VS2013常用快捷键
Visual Studio 2013 是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。VS 2013 中新增了很多提高开发人员工作效率的新功能,比如自动补全方括号、使用快捷键移动整行或整块的代码等;合理使用快捷键可以提高开发效率。但是Visual Studio提供的快捷键多如牛毛,那我们有没有必要掌握所有快捷转载 2016-09-27 14:31:31 · 1125 阅读 · 0 评论 -
SetWindowsHookEx 详解(三)
类型: WH_MOUSE值7,回调参数如下MouseProc callback functionAn application-defined or library-defined callback function used with theSetWindowsHookEx function. The system calls this function w转载 2016-09-27 14:33:18 · 763 阅读 · 0 评论 -
获取打印机连接状态及打印任务是否错误
HANDLE PrnHandle; if (OpenPrinter("EPSON Stylus Photo R270 Series",&PrnHandle,NULL)) { unsigned char buf[8192]; DWORD dwSize; if (Get转载 2016-11-28 13:26:44 · 5114 阅读 · 1 评论 -
获取打印机参数
1、打印机的分辨率(象素/英寸) X方向分辨率=GetDeviceCaps(Printer->Handle,LOGPIXELSX); Y方向分辨率=GetDeviceCaps(Printer->Handle,LOGPIXELSY); 2、打印纸的大小(以象素为单位) 通过Printer的PageWidth和PageHeight属性可转载 2016-11-28 13:24:46 · 3220 阅读 · 0 评论 -
类似error C2143: 语法错误 : 缺少“;”的奇葩问题
99%的原因就是没有包含头文件,编译器不认识所定义的类型。例如:vector vec;,如果出现如标题错误,肯定是没有加下面的代码#include using namespace std;原创 2016-12-08 14:39:55 · 796 阅读 · 0 评论 -
C++创建控件并响应三部曲、设置窗口全屏、OnSize实现控件大小改变、跟踪调试顺序
一、创建控件并响应事件三步曲:添加成员变量,变量类型为所创建控件的类型,如CButton1.手动添加 afx_msg void OnmyButton(); 2.手动添加实现函数; 3.关联:MESSAGE_MAP:ON_BN_CLICKED(IDC_MYBUTTON,OnmyButton)。二、VC设置窗口全屏显示的方法:通过设置窗口显示状态和窗口位置来使窗口全屏。在窗转载 2016-12-05 14:10:51 · 2916 阅读 · 0 评论 -
CTreeCtrl的用法
树形控件可以用于树形的结构,其中有一个根接点(Root)然后下面有许多子结点,而每个子结点上有允许有一个或多个或没有子结点。MFC中使用CTreeCtrl类来封装树形控件的各种操作。通过调用BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );创建一个窗口,dwStyle中可以使用以下一些树形控件的转载 2016-12-05 13:42:27 · 1641 阅读 · 0 评论