- 博客(60)
- 资源 (19)
- 收藏
- 关注
原创 基于curl 使用http多线程下载大文件
7、检验文件MD5是否一致。如需完整代码,可评论区留言。6、获取服务器文件MD5。四、等待所有线程完成。
2023-12-07 20:03:56 613 2
原创 C++ 九阴真经之异步队列
异步队列可以看作是消息队列和线程池的合体,输入端是用户自定义数据,输出端为用户自定义执行体。定义类型T定义执行体bool task(T& t){}就可以实现没每一个消息执行操作task(t)/************************************************************************************* 异步队列* 用户将数据压入队列,并自定义执行函数,对数据...
2020-06-30 21:27:39 1204
原创 C++ 九阴真经之线程池
线程池的作用: 1、避免了在处理短时间任务时创建与销毁线程的代价; 2、在大批量并发任务中,可以更合理的使用系统资源,进行削峰平谷,保证系统运行的稳定性;基于C++11标准构建线程池,具有以下优势; 1、任务无需继承接口 2、支持lambada表达式 3、支持全局函数、静态成员函数; 4、使用bind支持成员函数;class ThreadObject : public QueueObject{public: usin...
2020-06-30 21:24:50 234
原创 C++ 九阴真经之线程间通信(消息队列)
消息队列是线程间通信比较常用得方式,常用于解决经典模型生产者——消费者模型线程间得通信。本文将结束基于C++标准库实现得消息队列,可以支持任意参数类型,任务参数数量。为了方便后续线程池、异步队列得实现,这里提取了公共基类。class QueueObject : public noncopyable{public: QueueObject() :m_bStop(false), m_nCapacity(MAX_QUEUE_CAPACITY) { } virtual ~QueueO
2020-06-30 21:23:03 2522
原创 C++ 支持宏重载效果
C++宏默认是不支持重载的,但可以通过特殊方法让宏支持重载。可能你要问,支持宏重载有什么用处,那么,就以实例来尝试宏的重载。为了要实现类的动态创建,我还想构建类的继承关系图,为了简化注册,所以我需要用宏来简化注册。我需要以下宏来支持:REG_CREATE1(className)REG_CREATE2(className, baseName1)REG_CREATE3(className, baseName1, baseName2)C++支持多继承,但为了方便,我不希望每次注册的时.
2020-06-14 11:51:29 1947 1
原创 C++ 不定参宏展开
一、通过不定参宏进行日志输出#define LOGINFO(fmt,...) printf("[%s][%s]", __FUNCTION__, GETINFO(fmt, __VA_ARGS__)) 通过参数 __VA_ARGS__ 来展开不定参数, 这里借助宏可以输出日志的位置等信息。 这里不定参的输入如果为空,linux下可能无法编译通过,你需要加 ###define LOGINFO(fmt,...) printf("[%s][%s]", __FUNCTION__, GET...
2020-06-14 11:49:15 947
原创 C++ 基础类型万能转换器
你可能还在使用atoi、atof、itoa等函数进行类型转换,赶紧看过来,用一个函数,解决所有支持io流类型的转换。//基础类型转换template<typename OUT,typename IN, typename std::enable_if<!std::is_same<OUT, IN>::value, int>::type N = 0>OUT Convert(const IN& val){ std::stringstream ss; ss
2020-06-14 11:47:00 363
原创 C++ 九阴真经之命令控制模式
所谓命令控制模式,就是对应的行为进行封装,通过命令就能控制,你可以理解为linux下指令操作。 比如一个操作包括,A1、A2、.....A10这10步操作,如果某一步失败,那么就进行倒回,如果这10个操作的业务类型各不相同,并且所需要的参数也不尽相同,操作起来就比较困难,如果我能将他们全部封装成指令模式,只通过A1到A10这10个字符串就触发,那么实现起来就容易的多。 对于网络编程,命令控制就变得必不可少了,该模型可以帮你将网络层与业务层完美的管理在一起。 实...
2020-06-13 17:20:26 298
原创 C++ 九阴真经之控制反转 Ioc
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup) 实现代码:#include <sstream>#include <string>#include <unordered_map>#include <memory...
2020-06-13 17:17:29 395
原创 C++ 九阴真经之动态创建
动态创建对很多人来说,都不陌生,在一些大型项目中是比较常见的,也是MFC的核心机制,随着C++新标准的演化,很多东西都可以很简单的就实现。实现代码:#include <vector>#include <functional>#include "noncopyable.h"#include "singleton.h"#include "anyval.h"#define PRIVATE_REG_DYNCREATE_4(class_name, baseName1,
2020-06-08 20:49:04 137
原创 C++ 九阴真经之任意值
any是一个可用于任何类型单个值的类型安全的容器,目前已收录到C++17标准库,但对于一些历史 项目,可能并没有使用最新编译器,那么可以自己简单的实现。代码实现:#include <assert.h>#include <typeinfo>#include <string>class AnyVar{public: //保存真正数据的接口类 class placeholder { public: virtual ~placeholder
2020-06-08 20:46:32 168
原创 C++ 九阴真经之线程安全单例类
C++ 九阴真经之线程安全单例类与之前的单例类似,但普通的单例类是非线程安全的,就是是你不能有些线程读,有些线程写,一般来说,要安全访问单例,就需要用户自己加载来控制对单例的访问。日常开发中经常会需要加载配置数据,我希望程序运行过程中能够定时的去更新这些配置信息,比如log级别,一般情况下开启INFO级别即可,但处理问题时,我希望打印DEBUG Log。为了方便起见,这里实现一个线程安全单例,以便以后的项目能够快速的处理这种场景。代码实现://哨兵类,负责多线程操作,自动加锁解锁//
2020-06-08 16:15:05 157
原创 C++ 九阴真经之单例模式
C++ 九阴真经之单例模式单例类在日常开发中是非常常见的,用于管理一些配置数据及资源,提供全局访问。通过单例模式,可以做到:确保一个类只有一个实例被建立 提供了一个对对象的全局访问指针 在不影响单例类的客户端的情况下允许将来有多个实例代码实现://单例template<typename T>class Singleton : public noncopyable{public: static T & get_instance() { .
2020-06-08 16:11:51 138
原创 C++ 之九阴真经系列
C++ 之九阴真经系列很久没整理文档了,趁着近期比较空闲就想着整理一下,有些代码是很久以前写的,也有些是平时开发中遇到的一些不方便,也趁机把想要实现的一些模型一并实现了,整理过程中还是获益良多,所谓温故而知新吧。 本系列文档主要为一些C++比较常用的辅助类,或一些业务实现模型,如单例类、字符串、线程、时间、线程池等一些常用的理论知识。1、单例类 2、线程安全单例类 3、任意值类 4、类动态创建 5、控制反转 IOC 6、命令控制模式 7、消息队列 8、线程池 9、异步处理任务队列
2020-06-08 16:07:46 755 1
原创 Boost库学习之旅入门篇
Boost库学习之旅入门篇学习及使用Boost库已经有一段时间了,Boost为我的日常开发中带来了极大的方便,也使得我越来越依赖于boost库了。但boost功能太多,每次使用还是得翻看以前的资料,所以为了以后可以更方便的使用,在此对常用的功能作一个总结,也希望以此与大家共勉。 boost库下载,Svn地址: http://svn.boost.org/svn/boost/t
2014-03-21 20:49:22 819
原创 VS2010使用静态编译的qt库
Qt开发界面很方便,但发布程序就不那么方便了,你的把引用到的dll一起发布才行,要是能静态编译就好了,发布的时候只有一个exe多方便。 虽然以前为了方便,直接安装的qt-windows-opensource-5.0.2-msvc2010_32-x86-offline.exe, 省去了自己编译这一步,但官方提供的库是动态编译的,是以lib + dll形式存在的,所以没法在我的程序中静
2013-06-23 10:57:05 3612 7
原创 Win7系统VS2010下搭建qt开发环境
win7下vs2010搭建qt环境总算成功了,在此分享一下。最初选择了VS2012 + qt-windows-opensource-5.0.2-msvc2012_64-x64-offline.exe + qt-vs-addin-1.2.1-opensource.exe一路安装成功,创建时报错,错误信息如下:在网上搜索的都说,qt库暂时不支持vs2012, 需自行编译,故没有进一步深
2013-05-22 22:02:04 6675 1
原创 C#操作excel文件
using System;using System.Collections.Generic;using System.Linq;using System.Text;using Excel = Microsoft.Office.Interop.Excel;using System.IO;using System.Data;namespace ConsoleApplic
2013-05-06 17:34:50 381
原创 使用lua语言实现循环链表
List = {}--[[ 创建链表]]function List.new() local t = {next = nil, prev = nil, value = 0} t.next = t t.prev = t return t;endfunction List.push_front(list, val) local t = {next = list.
2013-03-13 09:16:59 1689
原创 多继承中多态的实现
#include using namespace std;class A{private: virtual void Func1() { cout << "class A Func1" << endl; } virtual void Func2() { cout << "class A Func2" << endl; }};c
2013-01-31 20:36:15 473
原创 多态是如何实现的
#include using namespace std;class A{public: virtual void Func1() { cout << "class A Func1" << endl; } virtual void Func2() { cout << "class A Func2" << endl; }};class
2013-01-31 20:28:36 426
原创 模拟编译器对虚函数索引项的实现
#include using namespace std;class A{public: virtual void Func1() { cout << "class A Func1" << endl; } virtual void Func2() { cout << "class A Func2" << endl; }};clas
2013-01-31 20:12:46 295
原创 通过交换虚函数表指针查看虚函数的实现方式
#include using namespace std;class A{public: virtual void Func1() { cout << "class A Func1" << endl; } virtual void Func2() { cout << "class A Func2" << endl; }};cl
2013-01-31 20:03:14 349
原创 通过虚函数指针绕过虚函数的保护机制
#include using namespace std;class A{public: A() { a = 10; }private: virtual void Func1() { cout << "class A Fu
2013-01-31 12:44:07 721 5
原创 编译器对虚函数的实现
#include using namespace std;class A{public: virtual void Func1() { cout << "class A Func1" << endl; } virtual void Func2() { cout << "class A Func2" << endl; }};int
2013-01-30 20:39:30 571
原创 获取本机mac地址和Ip地址
#include #include #include #include #include #include #include #include int main(int argc, char* argv[]){ if(argc < 2) printf("usage getmac interface为网络设备,如eth0, 可以通过/sb
2013-01-30 20:16:17 888
原创 Linux网络编程epoll模型
#include #include #include #include #include #include #include #include #include #include using namespace std;#define LISTENQ 5 #define OPEN_MAX 1024#define SERV_PORT 10
2013-01-30 19:15:20 952
原创 Linux网络编程poll模型
//分发进程//listen #include #include #include #include #include #include #include #include #include #define LISTENQ 5 #define OPEN_MAX 1024#define SERV_PORT 10088#define M
2013-01-30 18:31:53 1450
原创 Linux网络编程select模型的实现
#include #include #include #include #include #include #include #include #include #define LISTENQ 5 #define OPEN_MAX 1024#define SERV_PORT 10088#define MAX_LINE 1024#define
2013-01-30 18:25:57 1666 2
原创 原始套接字实现
#include #include #include #include #ifdef WIN32#include #include #include #else#include #include #include #include #include #endif#ifdef WIN32#pragma comment(lib,"
2013-01-30 18:06:44 1673
转载 如何在windows下编译Chrome源代码
序·关于Google Chrome Google Chrome 是Google 于2008年发布的一款开源的浏览器,它采用了许多开源的组件和工具,比如它的浏览器引擎采用的是开源的浏览器引擎WebKit。如果想获取Chrome的代码,可使用SVN从Google服务器上checkout,其SVN地址是src.chromium.org/svn,这是一个总目录,包含有 Chrome、Gea
2012-07-22 18:16:05 768
转载 c# Invoke和BeginInvoke 区别
<br />转自http://www.cnblogs.com/c2303191/articles/826571.html<br />Control.Invoke 方法 (Delegate):在拥有此控件的基础窗口句柄的线程上执行指定的委托。<br />Control.BeginInvoke 方法 (Delegate) :在创建控件的基础句柄所在线程上异步执行指定委托。<br />(一)Control的Invoke和BeginInvoke<br />我们要基于以下认识:<br />(1)Control的Inv
2010-07-04 09:09:00 271
原创 System.Data.OracleClient.OracleException: ORA-00979: not a GROUP BY expression
<br />今天因为这个问题纠结了很久,其实这已不是第一次犯这样的错误了,今天特别记录下来,以防再犯。<br />总的来说,是因为oracleclient类型转换产生的错误,同样一条正确的sql语句,今天不出错误,或许明天就会出错,结合个人的错误经历,错误的来源主要来源于聚集函数,一下示范错误是如何产生的:<br />首先,给出获取数据源的函数<br /> public DataTable ORselect(string str)<br /> {<br /> DataT
2010-06-18 14:06:00 2949
原创 xp sp3安装IIS
让你的xp sp3也能装iis一、安装IIS很多朋友想在本地测试asp的都需要装iis的,但是有时会不成功。我也遇到过这样的情况,相信你在2003下装是没问题的,但是我们现在用的大部分都是xp sp3了,那么我们该怎么在sp3下装iis呢?下面就拿自己的经验来给大家说一下。 首先下载II
2010-04-25 20:42:00 716
原创 快速排序算法
templateint Partition(Type a[],int p,int r){ int i=p,j=r+1; Type x=a[p]; while(true) { while(a[++i] while(a[--j]>x); if(i>=j)break; swap(a[i],a[j]); } a[p]=a[j]; a[j]=x; return j;}templatev
2010-04-03 14:26:00 408
马踏棋盘贪心法实现
2012-07-16
virsual C++ 编程高手
2011-01-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人