- 博客(37)
- 资源 (8)
- 收藏
- 关注
转载 修改SVN已提交项目的消息日志
直接在TortoiseSVN中修改过往日志,会提示:DAV request failed;it's possible that the repository's pre-revprop-change hook either failed or is non-existentAt least one property change failed; repository is unchange
2017-04-25 14:05:17 340
转载 C++虚函数表
前言C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。关于虚函数的使用方法,我在这里不
2017-04-25 13:40:58 345
转载 C++中extern “C”含义深层探索
1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不
2017-04-24 12:45:04 341
转载 虚析构函数(√)、纯虚析构函数(√)、虚构造函数(X)
一. 虚析构函数我们知道,为了能够正确的调用对象的析构函数,一般要求具有层次结构的顶级类定义其析构函数为虚函数。因为在delete一个抽象类指针的时候,必须要通过虚函数找到真正的析构函数。例如:#include using namespace std;class Base{public:Base() {}virtual ~Base() {cout<<"Base Destruct
2017-04-24 12:01:18 280
原创 C++类型转换
C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:TYPE b = (TYPE)a。C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。1.const_cast去掉const属性:#include using namespace std;class CMyClass{public: CMyClass() { m_nNu
2017-04-21 13:01:15 161
原创 信号量
信号量对线程的同步方式与前面几种方法不同,信号量允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。在用CreateSemaphore创建信号量时即要同时指出允许的最大资源计数和当前可用资源计数。一般是将当前可用资源计数设置为最大资源计数。每增加一个线程对共享资源的
2017-04-20 11:55:53 369
原创 事件对象
事件对象也可以通过通知操作的方式来保持线程的同步,并且可以实现不同进程中的线程同步操作。事件对象包含的几个操作原语:CreateEvent() 创建一个事件对象OpenEvent() 打开一个事件对象SetEvent() 设置指定的事件对象为有信号状态WaitForSingleObject() 等待一个事件 WaitForMultipleObjects() 等待多个事件
2017-04-19 15:16:05 685
原创 互斥量
互斥量跟临界区很相似,只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。当前占据资源的线程在任务处理完后应将拥有的互斥对象交出,以便其他线程在获得后得以访问资源。互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。 互斥量包含的
2017-04-19 15:00:26 335
原创 生产者消费者模式
#include <queue>#include <string>#include <mutex>#include <thread>#include <iostream>class CBuffer{public: CBuffer() {} ~CBuffer() {} static CBuffer* GetBuffe...
2017-04-19 12:38:19 206
转载 临界区
保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。 临界区包含两个操作原语: EnterCriticalSection() 进入临界区
2017-04-18 12:54:47 2587
转载 WaitForMultipleObjects用法详解
WaitForMultipleObjects是Windows中的一个功能非常强大的函数,几乎可以等待Windows中的所有的内核对象函数原型为:DWORD WaitForMultipleObjects( DWORD nCount, // number of handles in the handle array CONST HANDLE *lpHan
2017-04-18 12:26:39 524
转载 虚拟机扩充硬盘
1. 按 打开运行对话框,输入“CMD”,回车,打开命令提示符窗口;2. 进入 VMware 的安装目录(X:\Program Files\VMware\VMware Workstation);3. 输入一些命令 vmware-vdiskmanager.exe -x 30GB "f:\VM\window 2000\Windows 2000.vmdk";注意:a. 异常情况:Failed
2017-04-18 12:10:06 1021
转载 C++中虚析构函数的作用
我们知道,用C++开发的时候,用来做基类的类,其析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明:有下面的两个类:class Base{public:Base() {};virtual ~Base(){ cout << "Output from the destructor of class Base!" << endl; };virtual v
2017-04-18 12:06:22 192
转载 析构函数私有化
析构函数为private的类,只能用new生成对象,(用new生成的对象,在面向对象中是很有用的.它保存在堆上,可以自由控制生命周期。)但如何保证一个对象只能在堆上生成呢?答案其实也很简单,只需把析构函数定义为私有成员。例如OnlyCanBeNew类定义。class OnlyCanBeNew {public: OnlyCanBeNew(){}private:
2017-04-18 12:03:28 1422
原创 动态链接库加载函数的两种方法及区别
动态链接库的编写:1.创建一WIN32动态链接库工程Dll1,添加一C++源文件Dll1.cpp,在源文件中编写一个测试函数int _stdcall add(int a, int b){ return (a+b);}2.定义一模块定义文件Dll1.def,在里面添加如下内容:LIBRARY Dll1EXPORTSadd该文件的作用是导出函数
2017-04-18 11:54:24 4334
转载 gdb调试命令
01).gcc -Wall -g test.c -o test (生成可执行文件, -Wall打开警告提示)02).gdb test (进入调试状态)03).run(r) (启动调试)04).list(l) (查看最近十行的源代码)05).l
2017-04-18 11:45:17 189
转载 ubuntu自带VI编辑器不好用的解决办法
由于Ubuntu预安装的是tiny版本,就会导致我们在使用上的产生不便。所以我们要安装vim的full版本。首先,先卸掉旧版的vi,输入以下命令: sudo apt-get remove vim-common然后安装full版的vim,输入命令:sudo apt-get install vim这样安装好了之后的VI就没有那么难用了。
2017-04-18 11:44:19 452
转载 Ubuntu14.04下安装mongodb 3.X
1.安装keyapt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 2.添加源echo "deb http://repo.mongodb.org/apt/debian wheezy/mongodb-org/3.0 main" | sudo tee /etc/apt/sour
2017-04-18 11:42:34 740
原创 使用GCC开发动态库供java调用
1.开发环境Ubuntu14.04 64位+gcc4.8.4+JDK2.安装JDK1).查看JDK的版本$java -version2).安装JDK如何没有安装JDK,可以通过命令$javah 查看可安装的JDK包,选择一个安装(我系统上安装的是openjdk-7-jdk)命令如下:$sudo apt-get inst
2017-04-18 11:39:36 409
转载 事件选择模型
WSAEventSelect 是 WinSock 提供的一种异步事件通知I/O模型,与 WSAAsyncSelect模型有些类似。该模型同样是接收 FD_XXX 之类的网络事件,但是是通过事件对象句柄通知,而非像 WSAAsyncSelect一样依靠Windows的消息驱动机制。与WSAAsyncSelect模型相同,WSAEventSelect将所有的SOCKET事件分为如下类型:(共十
2017-04-18 10:33:26 784
转载 异步选择模型
WSAAsyncSelect模型是Windows socket的一个异步IO模型,利用这个模型,应用程序可在一个套接字上,接收以Windows消息为基础的网络事件通知。Windows sockets应用程序在创建套接字后,调用WSAAsyncSelect函数注册感兴趣的网络事件,当该事件发生时Windows窗口收到消息,应用程序就可以对接收到的网络事件进行处理。利用WSAAsyncSelect函数
2017-04-18 10:26:13 1705
转载 选择模型
select(选择)模型是Winsock中最常见的I/O模型。之所以称其为“ select模型”,是由于它的核心便是利用select函数,实现对 I/O的管理!利用select函数,我们判断套接字上是否存在数据,或者能否向一个套接字写入数据。之所以要设计这个函数,唯一的目的便是防止应用程序在套接字处于锁定模式中时,在一次I/O绑定调用(如send或recv)过程中,被迫进入“锁定”状态;同时防止在
2017-04-18 10:17:49 697
翻译 进程间通信
1.WM_COPYDATAWM_COPYDATA是一种非常强大却鲜为人知的消息。当一个应用向另一个应用传送数据时,发送方只需调用SendMessage函数(不能调用PostMessage,请参看MSDN),参数是目的窗口的句柄,WM_COPYDATA消息,源窗口的句柄,传递数据的起始地址。接收方只需像处理其它消息那样处理WM_COPYDATA消息,这样收发双方就实现了数据共享。WM_COP
2017-04-17 21:06:28 428
转载 等待定时器内核对象
相关函数:CreateWaitableTimer(LPSECURITY_ATTRIBUTES lpTimerAttributes, BOOL bManualReset, LPCTSTR lpTimerName);参数:lpTimerAttributes:一个结构体,用于设置对象的安全特性bManualReset:如果为TRUE,表示创建一个人工重置计时器;如果为FALSE,则创建一
2017-04-15 20:54:04 308
原创 向线程发送消息
函数原型:BOOL PostThreadMessage(DWORD dwThreadId,UINT uMsg,WPARAM wParam,LPARAM lParam);函数功能:该函数将一个消息放入到指定线程的消息队列里,不等待线程处理消息就返回。如果dwThreadId不是一个有效的线程标识符或由dwThreadId指定的线程没有消息队列,该函数将调用失败,GetLastError返回ERR
2017-04-14 21:12:41 1916 1
原创 单例模式
单例模式的作用:1). 确保一个类只有一个实例被建立2). 提供了一个对对象的全局访问指针3). 在不影响单例类的客户端的情况下允许将来有多个实例1.懒汉式懒汉式的特点是延迟加载:class Singleton{public: ~Singleton() = default; static Singleton* GetInstance() { if (nullpt...
2017-04-14 20:31:58 278
原创 智能指针
#include #include using namespace std;class CMyClass{public: CMyClass(int n) : i(n) { cout<<"CMyClass contructor"<<i<<endl; } CMyClass(const CMyClass& other) { cout<<"CMyClass copy cont
2017-04-14 13:09:32 225
原创 使用COM接口对象获得当前桌面墙纸的文件名
1.开发环境WINDOWS+VS2010+MFC Dialog Based2.为了添加接口对象类,需要在stdafx.h中的#include 行之前增加#include 3.在BOOL CXXXApp的InitInstance() 函数中初始化COM库,即调用函数CoInitialize(NULL),MFC会自动完成COM库的回收,因此不需要调用 CoUninitialize()
2017-04-13 22:14:26 371
转载 ASSERT和VERIFY的区别
1. ASSERT与VERIFY宏在Debug模式下作用基本一致,二者都对表达式的值进行计算,如果值为非0,则什么事也不做;如果值为0,则输出诊断信息。2.ASSERT与VERIFY宏在Release模式下效果完全不一样。ASSERT不计算表达式的值,也不会输出诊断信息;VERIFY计算表达式的值,但不管值为0还是非0都不会输出诊断信息。VERIFY与ASSERT用在程序调试上并无本质上的
2017-04-13 21:55:39 2075
转载 Direct Show的环境配置
1.安装DriectX9.0_c SDK,默认安装到C盘根目录下;2.编译基类源代码,生成静态库文件,使用VC6打开C:\DXSDK\Samples\C++\DirectShow\BaseClasses目录下的baseclasses.dsw工程,Debug/Debug Unicode版本生成strmbasd.lib,Release/Release Unicode版本生成strmbase
2017-04-13 21:43:21 749
原创 可变参数的格式化输出函数
#include #include #include #include using namespace std;//可用在多个平台下,不能处理宽字符int FormatOutput1(string& buf, const char* format, ...){ char szBuffer[1024]; memset(szBuffer, 0x0, sizeof(szBuffe
2017-04-13 16:04:49 1093
转载 Windows终止线程的四种方法
终止线程运行 若要终止线程的运行,可以使用下面的方法: • 线程函数返回(最好使用这种方法)。 • 通过调用 ExitThread 函数,线程将自行撤消(最好不要使用这种方法)。 • 同一个进程或另一个进程中的线程调用 TerminateThread 函数(应该避免使用这种方法)。 • 包含线程的进程终止运行(应该避免使用这种方法)。 下面将介绍
2017-04-13 15:14:49 7815
原创 STL map的用法
map是STL的一个关联容器,它提供一对一的数据处理能力(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)一.插入#include #include using namespace std;int main() { pair::iterator, bool> insert_pair; map cls; //1.使用pair
2017-04-13 14:57:23 306
转载 C++空类的研究
1.C++空类及没有成员变量的类的大小实例分析众所周知的C++中空类的大小为1,但是除了空类之外的其他一些没有成员变量的类的大小,还是有相当一部分开发人员对此有很多不明之处的。这里我们以如下代码为例:#include using namespace std;class a {};class b {public: void test() { cout << "test" <<
2017-04-13 13:21:26 267
转载 C++11新特性
1.auto关键字C++11中引入auto第一种作用是为了自动类型推导。auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型。通过auto的自动类型推导,可以大大简化我们的编程工作。auto实际上是在编译时对变量进行了类型推导,所以不会对程序的运行效率造成不良影响。另外,似乎auto并不会影响编译速度,因为编译时本来也要右侧推导然后判断与左侧是否匹配。 auto a; //
2017-04-13 12:12:57 482
原创 stringstream的用法
#include #include #include #include using namespace std;int main(){ ifstream infile1; infile1.open("d:\\test.txt"); string sLine, sWord; while (getline(infile1, sLine)) { istringstream i
2017-04-13 11:47:50 257
原创 C++标准库getline函数的使用
原型:getline(istream&, string&)从输入流istream读取一行数据到stirng中。#include #include #include using namespace std;int main(){ //使用通用的getline ifstream infile1; infile1.open("d:\\test.txt"); string sL
2017-04-13 10:39:30 2078
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人