
置顶随笔
摘要: 数据类型=存储内容+操作。这句话含义甚重。理解了这句话可帮助理解C++很多看似诡异的东西,如尾随参数的机制。本质来说芯片上存储的二进制数据是固定的,如1001 0011,但读取的时候,对于int和uint来说得到的是完全不同的值。实际上真正决定各种数据类型包括自定义数据类型的彼此不同的本质在于此处的操作。 三个基本概念:数据区(静态区)、堆、栈。其中数据区存储的是全局的或者静态的,总言之,生命周期是整个程序的,静态区是随着进程的建立而创建,知道进程的消亡而消亡。栈是系统托管的部分,其中存放的为局部变量,其生存周期完全是操作系统在管理,我们无权 过问。堆是我们来管理的,如new出来的对象...
阅读全文
posted @ 2011-12-11 11:18 BLoodMaster 阅读(904) 评论(5)
编辑
摘要: 先说下我的现状吧,在一家百人左右的民企做软件开发,软件部十来个人吧。产品是煤矿的监控类的。就是工控行业的一个分支了。我毕业两年半,做了两年C#。半年,真正意义上三个月C++,能熟练运用的语言就C#、VBS、JS之类的,C++算一般熟悉,接触过有一定入门经验的也就java、flex、python。对数据库mssql用得熟悉,mysql、orcl、db2不怎么熟悉,但也能用,不过也就做些简单的事情了,干不了复杂的。对于硬件部分,因为大学是物理的,我们学校是工科的,大家都要学习电路类的东西,算一般熟悉吧,正常的什么数字芯片也能认识一些,自己也能搭建出来什么加法器,也知道什么叫甲乙类电路。汇编能看懂.
阅读全文
posted @ 2011-12-10 16:52 BLoodMaster 阅读(3379) 评论(48)
编辑
摘要: 最近发现异步在园子里面又突然热了起来,之前甚至看到有人调侃在捣鼓泛型约束的人说现在时4.0了,不要再捣鼓2.0的泛型了,要与时俱进开始整异步。当然本人有喷子的潜质,所以我就喷了那个人说异步的概念远比泛型早多了,可以算是古董了。 因为现在做C++,对C#这边倒渐渐生疏了下来,尤其4.0,很多东西都是靠浏览园子里面的文章来补充知识。所以到现在我也不知道为什么4.0了异步就开始热火了,毕竟这个真的是古董级别的,一点都不比云计算的概念来得年轻,都不知道是上个世纪哪个旮旯年代就被提出来了,云计算一直因为种种原因基本与世隔绝,直到当下取了个洋气的名字才开始风行。而异步却很早就渗入到了程序员的级别,无...
阅读全文
posted @ 2011-12-06 22:51 BLoodMaster 阅读(1486) 评论(9)
编辑
摘要: C#的事件机制让C#程序员如鱼得水,尤其在架构的时候,事件驱动机制让弱耦合成为一种主流。但对于我们从事C++开发的程序员来说,心理甚是羡慕嫉妒恨,尤其像我这种半路从C#出家C++的。 本文实现的是C++模仿C#的事件。 与C#的事件机制表现形式比较: 相似点:采用+=、-=运算符实现事件注册注销工作 差异点:本文中使用事件的类,第一个成员变量必须是CObjectSender ,自定义事件类第一个成员变量必须为EventArgs。 测试类:1#include"stdafx.h"2#include<string>3#include<iostream>4#
阅读全文
posted @ 2011-11-22 18:33 BLoodMaster 阅读(1061) 评论(8)
编辑
摘要: 继续之前的异步重叠的系列,本文实践的为TCPSrv的完成端口实现,之前文章中层提到过该概念,也是被奉为WINDOWS SOCKET编程的最优解。但是否真的是最优,本文没测试,很多东西,个人认为看情形用远比抱着一个什么最好的情结更实用。 依旧的风格,直接上代码,至于想捣鼓IOCP的人,看完整篇的代码也应该懂了。我还是相信代码以及运行结果远比一本书的文字来的有说服力。当然我的代码中必要的注释都还是存在的,以协助说明思路。 编写主体前准备工作:View Code 1#include<afxtempl.h>2#include"winsock2.h"3#include&l
阅读全文
posted @ 2011-11-21 16:23 BLoodMaster 阅读(1066) 评论(0)
编辑
摘要: 1. int与char*之间的转换: intatoi(const char * str); 示例 char* ch = "152"; int num = atoi(ch); 输出:num = 152; char* itoa(int Val, char * DstBuf, int Radix); 示例 int number = 123456789; char string[25]; char* ch; ch = itoa(number, string,10); 输出:ch =“12345...
阅读全文
posted @ 2011-11-18 10:27 BLoodMaster 阅读(1537) 评论(11)
编辑
摘要: 在进程之间通信,涉及一个环形缓冲区的可能性很大。本文讲解自己做的一个简单的环形缓冲区。因为简单,故而直接把代码放在下面,有兴趣的朋友可帮忙给些建设性的建议。 类结构://-------------------------------------------------------------------------------------------------//数据交换区classCBuf{////////////////////////////////////////////////////////////////////////////////////////////////////.
阅读全文
posted @ 2011-11-17 18:44 BLoodMaster 阅读(907) 评论(4)
编辑
摘要: 前一个项目中,当时遇到日志的问题,因为时间紧迫,用了开源社区的glog。但本人对开源的东西又或者说不是自己写的东西的总有点不放心,也可以说是心理有点疾病吧。于是今天就趁着闲下来,自己写了个C++的日志类,机制是仿照自己之前写的C#log类。 日志类所要解决的问题: 1. 自检查目录以及文件的存在性,如果不存在,则创建 2. 多线程冲突问题 3. 写日志的功能(最根本的需求) 本文中采用的思路为增加自定义缓冲区与冲突锁以解决线程间冲突问题,采用后台线程负责单独写操作,采用单例以解决文件访问冲突问题。至于目录以及文件的存在性问题,这些为基本API函数调用而已。 故而定义的类...
阅读全文
posted @ 2011-11-17 16:26 BLoodMaster 阅读(319) 评论(1)
编辑
摘要: 继续之前的异步重叠之完成例程的实践,本文讲述的为UDP的实现。UDP不同于TCP,UDP为对等通信,无需再分服务器端和客户端。至于UDP和TCP之间的区别,此文就不再赘述了,相信阅读此文的你对此已经深有理解,不熟悉的可google。 UDP的实现思路:设置本地终端,初始化SOCKET套接字,绑定到本地端口,开启单独接收线程。单独接收线程之中使用完成例程来实现接收数据,与之前两篇思路一致,均是在类中开一个缓冲区作为接收缓冲。对上提供统一的读写接口。 类似 之前两篇的讲述,直接上代码。其中实现细节,代码中,仔细看,自然会明白。头文件:View Code 1#include<std...
阅读全文
posted @ 2011-11-15 18:14 BLoodMaster 阅读(962) 评论(2)
编辑
摘要: 继续之前的完成例程的实践,本文讲解的为TCPSrv的完成例程的实现过程。 其中用到的系统或库中的结构体与函数,此处不再重述,可参考前一篇讲解。此处直接讲解实现。 思路: 设置本地终端地址,创建SOCKET套接字,绑定到本地终端,开始进入侦听模式,开单独线程进行侦听,获取到的数据放到本地缓存。对上提供统一的读写接口。 上代码: 头文件:1#include<stdio.h>2#include<tchar.h>3#include<afxtempl.h>4#include<stdio.h>5#include<tchar.h>6#include
阅读全文
posted @ 2011-11-14 16:13 BLoodMaster 阅读(467) 评论(2)
编辑
摘要: 在当今工控行业、ERP管理行业之中,cs的身影随处可见,随之而来的socket网络通信也漫天盖地。本文着重讲解其中的一种实现:异步重叠之完成例程,之所以没用完成端口,本人始终不认为客户端需要使用完成端口,倒是TCP服务器,完成端口事在必行。闲话就不多说了,下面开始讲解异步重叠如何实现TCP客户端。 SOCKET通信,无论是c++还是C#又或者java,遵循步骤都一致。如客户端均为:连接远程服务器终端,收发数据,关闭连接,只是实现细节方面相差甚至可谓迥异。 本文采用C++的异步重叠完成例程来实现。之所以采用完成例程,主要是想从回调函数得到好处。 知识补充: 1.网络知识,此处...
阅读全文
posted @ 2011-11-10 01:00 BLoodMaster 阅读(1079) 评论(2)
编辑
摘要: 在工控行业,目前总线型通信依然占据半壁江山。常用的如485,CAN等。而面对小型系统时,尤其监控区域遍布在两公里范围内时,通过485-232或者CAN-232转换模块,使用上位机的串口与下属硬件通信组成系统便成了相对节约的一种设计方案。 本文的重点在于讲解异步重叠操作串口的思想以及过程。 所有的IO设备的操作都遵循:创建、参数设置、读写、关闭三个步骤。 知识补充:此文中需要使用到的几个结构体:1typedefstruct_COMSTAT{2DWORDfCtsHold:1;3DWORDfDsrHold:1;4DWORDfRlsdHold:1;5DWORDfXoffHold:1;6D...
阅读全文
posted @ 2011-11-09 11:26 BLoodMaster 阅读(1110) 评论(4)
编辑
摘要: 今天上网搜索c++的命名空间,是想看c++的命名空间是不是开放的,我随时可以往其中添加内容,无意中搜索到了一片比较c++、java、C#命名空间的文章,后来发现还被很多人转载了,在这里,我表示压力很大,因为那一篇文章纯粹乱忽悠,却能被很多人转载,所以深切感觉到网上有技术含量的技术博客太少了,大多都是复制粘贴充门面,对于他们对博客业发现的贡献,我表示膜拜,但对于他们对技术的亵渎,我表示鄙视一下。贴出他们的论点,仅贴出来而已,不讨论了,只是作为证明我上面第一段的话是有根据的,至于他们观点的荒唐之处,就不说了,因为编程的应该都能看懂,所以我给原文作者留言是:大哥,你不是编程的吧。 支持泛型引用简洁.
阅读全文
posted @ 2011-10-27 10:51 BLoodMaster 阅读(128) 评论(0)
编辑
posted @ 2011-09-26 20:53 BLoodMaster 阅读(2175) 评论(5)
编辑

2012年5月24日
摘要: 学术幻灯片管理解决方案草稿2012-X-XX发布 2012-X-XX实施关于本方案本方案为投标使用草案,于初步沟通需求的基础之上拟定。后续需根据实际情况进一步修正完善细节方面具体内容。此方案中主要分为分析需求以及对于解决方案的概要设计,包含部分通信协议。关键字解释 服务器:整个系统的核心所在,安装在幻灯室,用于统一管理各个客户端软件,接受幻灯片的上传、会场录像的上传。可配置日程信息,并保存于数据库。根据数据库中日程信息统一调度各个相关客户端。日程信息包括演讲批次、演讲地点、演讲主题、演讲者姓名、演讲者单位、演讲者照片,演讲开始时间与结束时间。 会场端:安装在会场,开启本地监听,用于接受服务器端
阅读全文
posted @ 2012-05-24 08:14 BLoodMaster 阅读(21) 评论(32)
编辑

2011年12月11日
摘要: 数据类型=存储内容+操作。这句话含义甚重。理解了这句话可帮助理解C++很多看似诡异的东西,如尾随参数的机制。本质来说芯片上存储的二进制数据是固定的,如1001 0011,但读取的时候,对于int和uint来说得到的是完全不同的值。实际上真正决定各种数据类型包括自定义数据类型的彼此不同的本质在于此处的操作。 三个基本概念:数据区(静态区)、堆、栈。其中数据区存储的是全局的或者静态的,总言之,生命周期是整个程序的,静态区是随着进程的建立而创建,知道进程的消亡而消亡。栈是系统托管的部分,其中存放的为局部变量,其生存周期完全是操作系统在管理,我们无权 过问。堆是我们来管理的,如new出来的对象...
阅读全文
posted @ 2011-12-11 11:18 BLoodMaster 阅读(904) 评论(5)
编辑

2011年12月10日
先说下我的现状吧,在一家百人左右的民企做软件开发,软件部十来个人吧。产品是煤矿的监控类的。就是工控行业的一个分支了。
我毕业两年半,做了两年C#。半年,真正意义上三个月C++,能熟练运用的语言就C#、VBS、JS之类的,C++算一般熟悉,接触过有一定入门经验的也就java、flex、python。对数据库mssql用得熟悉,mysql、orcl、db2不怎么熟悉,但也能用,不过也就做些简单的事情了,干不了复杂的。对于硬件部分,因为大学是物理的,我们学校是工科的,大家都要学习电路类的东西,算一般熟悉吧,正常的什么数字芯片也能认识一些,自己也能搭建出来什么加法器,也知道什么叫甲乙类电路。汇编能看懂代码,当然比较吃力,自己编写就算了,肯定会傻掉,当然给一个月时间的话,估计入门做一些简单的东西还是可以的。C语言,因为C++的缘故,不算陌生,代码基本能看懂,不像看汇编那么费力,自己也能写写C的东西,当然都是简单的小得东西。
做过的项目数倒还可以,有五六个了吧,其中分布式的一个。C++的两个,C#的三四个。C++的项目算小得,我经手的代码行总共一千多行代码吧,C#的七八万行代码。架构方面较为熟悉,自己搭建架构的话,一般企业级的项目都能干得下来,从OOA到OOD,当然假如我还要OOP的话,我自己总忍不住删掉一些规划,为的是少写些代码。人有点懒。
现在要去的是南京的软通动力,做的是华为的外包,之前联系过华为,后来种种原因没去。当然我虽然是做华为的外包,但我不会心理不平衡的,大家合作关系而已,不会觉得好像低一等,否则我也不会准备去软通了。
现状是,他们准备让我过去,职称是高级软件工程师,职位是项目经理,开发语言是C++。问题就在最后这个C++上面,毕竟我做C++真的时间不够长。而且我坚决不相信网上某些大神说的:精通一门语言,别的语言自然就会了。当然C#我谈不上精通了。我现在最大的感触就是其实每一门语言都是一种思想,你选择一门语言作为解决问题的工具的时候,其实你已经被这个语言绑架了,C++教科书上喜欢说事面向对象语言,但我只能说半个,一个拖着面向过程的身子长着面向对象头颅的语言。虽然C++中建议使用const代替宏,不提倡使用void*,但实际上C++永远也不可能脱离他的身子而存在。
回到正题吧,做C++项目经理,我心理发虚啊,毕竟底子不够啊。谁能给我点建议啊
posted @ 2011-12-10 16:52 BLoodMaster 阅读(3379) 评论(48)
编辑

2011年12月6日
最近发现异步在园子里面又突然热了起来,之前甚至看到有人调侃在捣鼓泛型约束的人说现在时4.0了,不要再捣鼓2.0的泛型了,要与时俱进开始整异步。当然本人有喷子的潜质,所以我就喷了那个人说异步的概念远比泛型早多了,可以算是古董了。
因为现在做C++,对C#这边倒渐渐生疏了下来,尤其4.0,很多东西都是靠浏览园子里面的文章来补充知识。所以到现在我也不知道为什么4.0了异步就开始热火了,毕竟这个真的是古董级别的,一点都不比云计算的概念来得年轻,都不知道是上个世纪哪个旮旯年代就被提出来了,云计算一直因为种种原因基本与世隔绝,直到当下取了个洋气的名字才开始风行。而异步却很早就渗入到了程序员的级别,无论linux还是windows上C++的编程,异步是一个很正常的处理问题的方法。
下面就转入正题,说说C#的异步吧,也赶一会潮流,虽说到现在我也不知道为什么异步现在如此火热,园子里首页基本天天看到异步。
要讲异步不得不首先提到同步,就像说一个人的性格,不得不扯上他得胞兄,虽说他的胞兄很无辜,但这个世界上有些事情总要有些人做些陪衬,即使他本来可能更出色。
有人说同步就是对讲机,异步就是电话机。但我总觉得类比是个蛋疼的玩意,毕竟即使B与A真的很像,但毕竟不同,B永远不是A。一类比就意味着你已经漏了很多原汁原味的东西,更坏的结果就是类比让人开始了南辕北辙,缘木求鱼。所以我还是建议能看英文的就尽量看英文,再不济你看看msdn也行,对于windows下的开发而言,msdn真的是奢侈品,等哪天你遇到问题你不得不去查看源码,而没有帮助手册的时候你才会发现啊,原来曾经我们生活在天堂啊。当然微软的源码问题也一直被诟病,毕竟他很多都不开源。
下面解释下关于同步异步的定义吧。
同步:等待函数执行后返回
异步:不等待函数的执行而直接返回
相信大家小学的时候都学过统筹方法吧,华罗庚那个,说烧开水的。那篇文章讲得就是异步。忘记了也没关系,反正我要改编。
| 比如,想泡壶茶喝。当时的情况是:开水没有;水壶要洗,茶壶茶杯要洗;火生了,茶叶也有了。怎么办? 办法甲:洗好水壶,灌上凉水,放在火上;等待水开,水开了后去洗茶壶、洗茶杯、拿茶叶;泡茶喝。 办法乙:洗好水壶,灌上凉水,放在火上;烧水的同时去洗茶壶、洗茶杯、拿茶叶;等水开,泡茶喝。 |
看完这个,应该很清楚什么叫同步什么叫异步了。
同步就是你干事一个个顺着干,干完这个干那个。异步就是你把这个安排下然后就去干别的事了,而这件事就被你安排给别人去干了,你只问结果。(当然实际上你是可以不问结果的,对于有些事情,假如你不在意其结果的话。)
也许你会问我,第二种模式下假如在洗茶杯的时候水开了咋办啊,其实不怎么办,直接去把火关了,然后再去洗茶杯。当然这时你又会问我,那我洗茶杯的时候,我怎么知道水开了啊?
这里面涉及一个观察者模式,别怕,这些神马模式都是扯淡的浮云,我说了具体实现方法估计你又要雨停了,天晴了,你又觉得你行了。其实在C#里面有一个东西叫事件,当然java也有啊,这里只是局限于园子是C#的(主要是C#的)就拿C#说事了。水烧开了,你直接触发那个事件就OK了,而我,也就是这里面的主角,事先注册了这个事件的响应方法就行了,这里就是去关火。
又扯远了,下面继续回来扯同步异步。
相信此时你对什么是同步什么是异步很清楚了。
C#下面最简单的同步就是你写的最基本的顺序方法,做事一个跟着一件,后来遇到跨线程调用UI线程的东西,你发现C#竟然不准跨线程干这个事情,于是msdn又告诉了你一个方法Invoke。于是空气又清晰了。
异步,后来你发现有时候有些事情真耗时,而我可不想给用户这个体验,连CPU都知道决不让自己闲着,那么我们更不能让线程阻塞着。于是我们想到了异步。于是msdn又告诉了我们BeginInvoke,当然顺带你又瞟到了EndInvoke与IAsyncResult。于是你学会了这东西怎么用了。
现在我想问的是,这两个东西他们开销的资源是谁的啊?
同步你理所当然认为是当前线程的,异步你就开始迷糊了。
上面的例子中,无论是同步还是异步,烧水这个事情开销的都是煤气灶的资源,是他在烧水,而不是你在烧水。这个时候就要看我们系统的边界了,如果我们的边界是人、煤气灶、水壶、水、茶叶等等所有资源,那么开销的都是系统的资源。无论同步还是异步,只是异步能让当前线程解放出来,而从线程池里面找了个煤气灶出来,让其负责去烧水。而同步的状况下就是当前线程在傻傻的烧水,从用户体验来说,异步明显好过同步,因为当前线程不会阻塞在那个傻×点上面。但线程池的毕竟也是线程,线程的切换需要开销资源,所以异步相对而言多开销资源了。
我们编程也一样,组件多了或者线程多了必然带来哪些不必要的浪费。但有时候这种浪费是必要的,而且是经济的。
上面说的系统边界包括了所有,第二种就是系统边界就是人,那么烧水开销的就是外部资源了,这个时候同步的话,系统是不开销烧水的资源,但却要傻傻的开销等水烧开的资源,于是实际上系统是开销了烧水的时间资源,当然这里不会包括空间资源。但异步的话,却只开销一个水烧开后的泡茶叶的资源,而不必开销那个傻等的资源。但这里面涉及一个通信也就是水壶需要告诉你水开了这个消息,这里面就涉及到了回调函数,于是就涉及到了另一个资源开销,系统态、用户态切换的资源消耗,但通常情况下和等水烧开开销的时间资源完全不是一个档次。所以此处异步相对同步来说,好处已经不是一两点了。
也许你也发现了我上面在玩弄文字游戏,于是你觉得这个作者真是个不懂技术的人,只会扯淡。恩,我的确很喜欢扯淡,不然怎么扯出一篇文章啊。
但如果你自己独立做过几个系统你会发现好像又有点道理,不是纯粹扯淡。
在我们做简单的管理系统的时候以及一些简单单机app的时候,不涉及外设,我们所遇到的东西都是我们系统内的,这个时候异步纯粹是为了交互体验,总资源消耗并不会真的变少,因为这里的异步其实就是个多线程而已,减少的是时间资源,但也增加了空间资源。
但假如我们做的涉及台位之间通信的app,那么这个时候对于通信部分的异步或者和外设之间的异步就不再是多线程那么简单了。如socket的异步重叠或者IOCP,煤气灶已经是外部资源了,煤气灶烧水并不会增加CPU的负载,只有等到谁烧开了通知CPU,CPU才会开始消耗资源,也就是泡茶叶。
相信很多人都对异步捣鼓过,都想过这东西用多线程不也能实现异步。但线程的创建和自杀都是消耗CPU的,我们没事还是别折磨CPU的好。所以虽然我们上面说的第一种系统边界,微软也用了线程池这个概念,为的就是别折磨CPU了,毕竟他是我们的老祖宗,你折磨他,他就折磨你的用户,反过来你的用户就要来折磨你了。对于第二种系统边界,千万别没事用多线程去模拟异步,那更是闲的蛋疼,小心你的用户不付你钱。
异步的东西就扯这么多了,文章里面有些东西可能存在问题,很多都是我自己的理解,所以估计出问题的概率较大,还望阅读此文的你对其中错误予以指正,对于不足予以补充。
posted @ 2011-12-06 22:51 BLoodMaster 阅读(1486) 评论(9)
编辑

2011年11月22日
C#的事件机制让C#程序员如鱼得水,尤其在架构的时候,事件驱动机制让弱耦合成为一种主流。但对于我们从事C++开发的程序员来说,心理甚是羡慕嫉妒恨,尤其像我这种半路从C#出家C++的。
本文实现的是C++模仿C#的事件。
与C#的事件机制表现形式比较:
相似点:采用+=、-=运算符实现事件注册注销工作
差异点:本文中使用事件的类,第一个成员变量必须是CObjectSender ,自定义事件类第一个成员变量必须为EventArgs。
测试类:
1 #include "stdafx.h"
2 #include <string>
3 #include <iostream>
4 #include <list>
5 #include "HunterEvent.h"
6 using namespace std;
7
8 // 事件参数
9 class MyEventArgs
10 {
11 public:
12 EventArgs args;
13 int age;
14 };
15
16 // 学生类,测试类
17 class Student
18 {
19 private:
20 ObejctSender sender;
21 int age;
22
23 public:
24 HunterEvent m_event;
25
26 // 设置年龄
27 void SetAge(int p)
28 {
29 age = p;
30 }
31
32 // 获取年龄
33 int GetAge()
34 {
35 return age;
36 }
37
38 // 事件触发器
39 void Trigger()
40 {
41 MyEventArgs arg;
42 arg.age = age;
43 m_event.Trigger(&sender, &arg.args);
44 }
45 };
46
47 void MMSSS(ObejctSender* sender, EventArgs* args)
48 {
49 int temp1 = ((Student*)sender)->age;
50 int temp2 = ((MyEventArgs*)args)->age;
51 cout<<"1111 sender "<<" eventargs "<<temp2<<'\n';
52 }
53
54 void SSSMM(ObejctSender* sender, EventArgs* args)
55 {
56 int temp1 = ((Student*)sender)->age;
57 int temp2 = ((MyEventArgs*)args)->age;
58 cout<<"2222 sender "<<" eventargs "<<temp2<<'\n';
59 }
60
61 int _tmain(int argc, _TCHAR* argv[])
62 {
63 cout<<"未绑定事件"<<'\n';
64 Student s;
65 s.Trigger();
66
67 cout<<sizeof(Student)<<'\n';
68
69 cout<<"绑定MMSSS事件,10岁"<<'\n';
70 s.SetAge(10);
71 s.m_event += MMSSS;
72 s.Trigger();
73
74
75 cout<<"绑定MMSSS与SSSMM事件,10岁"<<'\n';
76 s.m_event += SSSMM;
77 s.Trigger();
78
79 cout<<"绑定MMSSS与SSSMM事件,20岁"<<'\n';
80 s.SetAge(20);
81 s.Trigger();
82
83 cout<<"注销MMSSS事件,20岁"<<'\n';
84 s.m_event -= MMSSS;
85 s.Trigger();
86 system("PAUSE");
87 return 0;
88 }
运行结果:

源码下载地址:http://download.csdn.net/detail/fryhunter/3828019
posted @ 2011-11-22 18:33 BLoodMaster 阅读(1061) 评论(8)
编辑

2011年11月21日
摘要: 继续之前的异步重叠的系列,本文实践的为TCPSrv的完成端口实现,之前文章中层提到过该概念,也是被奉为WINDOWS SOCKET编程的最优解。但是否真的是最优,本文没测试,很多东西,个人认为看情形用远比抱着一个什么最好的情结更实用。 依旧的风格,直接上代码,至于想捣鼓IOCP的人,看完整篇的代码也应该懂了。我还是相信代码以及运行结果远比一本书的文字来的有说服力。当然我的代码中必要的注释都还是存在的,以协助说明思路。 编写主体前准备工作:View Code 1#include<afxtempl.h>2#include"winsock2.h"3#include&l
阅读全文
posted @ 2011-11-21 16:23 BLoodMaster 阅读(1066) 评论(0)
编辑

2011年11月18日
摘要: 1. int与char*之间的转换: intatoi(const char * str); 示例 char* ch = "152"; int num = atoi(ch); 输出:num = 152; char* itoa(int Val, char * DstBuf, int Radix); 示例 int number = 123456789; char string[25]; char* ch; ch = itoa(number, string,10); 输出:ch =“12345...
阅读全文
posted @ 2011-11-18 10:27 BLoodMaster 阅读(1537) 评论(11)
编辑

2011年11月17日
摘要: 在进程之间通信,涉及一个环形缓冲区的可能性很大。本文讲解自己做的一个简单的环形缓冲区。因为简单,故而直接把代码放在下面,有兴趣的朋友可帮忙给些建设性的建议。 类结构://-------------------------------------------------------------------------------------------------//数据交换区classCBuf{////////////////////////////////////////////////////////////////////////////////////////////////////.
阅读全文
posted @ 2011-11-17 18:44 BLoodMaster 阅读(907) 评论(4)
编辑
摘要: 前一个项目中,当时遇到日志的问题,因为时间紧迫,用了开源社区的glog。但本人对开源的东西又或者说不是自己写的东西的总有点不放心,也可以说是心理有点疾病吧。于是今天就趁着闲下来,自己写了个C++的日志类,机制是仿照自己之前写的C#log类。 日志类所要解决的问题: 1. 自检查目录以及文件的存在性,如果不存在,则创建 2. 多线程冲突问题 3. 写日志的功能(最根本的需求) 本文中采用的思路为增加自定义缓冲区与冲突锁以解决线程间冲突问题,采用后台线程负责单独写操作,采用单例以解决文件访问冲突问题。至于目录以及文件的存在性问题,这些为基本API函数调用而已。 故而定义的类...
阅读全文
posted @ 2011-11-17 16:26 BLoodMaster 阅读(319) 评论(1)
编辑

2011年11月15日
摘要: 继续之前的异步重叠之完成例程的实践,本文讲述的为UDP的实现。UDP不同于TCP,UDP为对等通信,无需再分服务器端和客户端。至于UDP和TCP之间的区别,此文就不再赘述了,相信阅读此文的你对此已经深有理解,不熟悉的可google。 UDP的实现思路:设置本地终端,初始化SOCKET套接字,绑定到本地端口,开启单独接收线程。单独接收线程之中使用完成例程来实现接收数据,与之前两篇思路一致,均是在类中开一个缓冲区作为接收缓冲。对上提供统一的读写接口。 类似 之前两篇的讲述,直接上代码。其中实现细节,代码中,仔细看,自然会明白。头文件:View Code 1#include<std...
阅读全文
posted @ 2011-11-15 18:14 BLoodMaster 阅读(962) 评论(2)
编辑