阳光VIP

少壮不努力,老大徒伤悲。平日弗用功,自到临期悔。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

2012年2月4日

摘要: CComPtr CComPtr派生自模板类CComPtrBase<T>,T代表某个COM接口。CComPtrBase<T>类只有一个成员变量T* p。下面是它们的代码分析:构造函数protected: CComPtrBase() throw() { p = NULL; } CComPtrBase(_In_ int nNull) throw() { ATLASSERT(nNull == 0); (void)nNull; p = NULL; } CComPtrBase(_In_opt_ T* lp) throw() { p = lp; if (p != NULL) p-&g 阅读全文

posted @ 2012-02-04 22:19 阳光VIP 阅读(304) 评论(0) 推荐(0)

摘要: “Windows游戏编程大师技巧"第二版 是一本很经典的书,里面虽然没有涉及到3D,但是游戏编程的很多基础知识还是很重要的。今天用visual studio 2005对它的第一个例子进行尝试。1)先创建一个win32工程,空工程T2(因为T1我失败了 :) )2)修改T2的字符集属性为多字符集3)将范例工程T3DCHAP01目录下的三个文件freakout.cpp,blackbox.h,blackbox.cpp复制到新工程目录下,并在项目中加入这三个文件4)设置工程的配置属性下的c/c++目录为Direct8.1所在的include目录(你需要先安装Direct8.1)5)编译,会一 阅读全文

posted @ 2012-02-04 22:19 阳光VIP 阅读(116) 评论(0) 推荐(0)

摘要: 利用Runtime.execute方法,我们可以在Java程序中运行Linux的Shell脚本,或者执行其他程序。参考了互联网上的这篇文章:http://lee79.javaeye.com/blog/418549(感谢一下),我重新整理了代码。现在通过CommandHelper.execute方法可以执行命令,该类实现代码如下:package javaapplication3;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;/**** @author chensh 阅读全文

posted @ 2012-02-04 22:18 阳光VIP 阅读(232) 评论(0) 推荐(0)

摘要: 这真是一个艰难的探索,iBATIS也许是个不错的Framework,但是文档写的很不好,从头到尾都缺少一个完整的例子。如果习惯了微软MSDN和NetBeans.org上面的文章风格,你会觉得iBATIS的文章作者真的是不懂如何写文章。iBATIS文章中很多例子片段都不能使用,不知道为什么? 先交代一下开发环境:UBuntu9.10 AMD64 英文版 + NetBeans6.71. + JDK1.6 +iBATIS 3.0.0.211。第一步,获取最新的iBATIS源代码为什么要获取最新源代码,因为我用Beta5的jar包总是出错,我怀疑有bug。当我取得了最新源代码,并编译后,问题解决了。所 阅读全文

posted @ 2012-02-04 22:18 阳光VIP 阅读(117) 评论(0) 推荐(0)

摘要: 从这里获得最新版本http://code.google.com/p/inotify-java/,并参考下面的安装手册注意,当前版本号是0.1,所以[version]都要换成0.1并且还需要设置环境变量JAVA_HOME,可以只在编译用的终端设置export JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.15/要先安装过ant,然后进入解压后的目录,使用如下命令编译:chenshu@chenshu-desktop:~/work/inotify-java-0.1$ ant release -Dversion=0.1然后拷贝已经编译出来的动态库到/usr/lib目录 阅读全文

posted @ 2012-02-04 22:17 阳光VIP 阅读(344) 评论(0) 推荐(0)

摘要: 我使用Ganymed库,访问http://www.ganymed.ethz.ch/ssh2/网页,下载最新版本的程序,解压后,在NetBeans下如下设置。 然后在我们的Java应用程序中,加入Ganymed-ssh2-build2库。假定我在192.168.0.110的UBuntu Server 9.04系统的/home/chenshu目录下放了一个文件夹test,test文件夹对应测试Java类的包名test,我们在该机器上运用javac ./test/Main.java编译后,在另一台机器上运行Java程序,该程序通过调用我们新建的Ganymed-ssh2-build2库的类完成远程调用 阅读全文

posted @ 2012-02-04 22:17 阳光VIP 阅读(459) 评论(0) 推荐(0)

摘要: 1)下载Log4j的程序http://logging.apache.org/log4j/1.2/download.html解压后在我的机器下目录如下:~/work/apache-log4j-1.2.15如果要重新编译,需要安装maven2,可以参考INSTALL文件的内容。可以不用编译。2)在~/work/apache-log4j-1.2.15目录下添加一个Server端的配置文件socketserver.properties,内容如下:文件名socketserver.properties#log4j.rootCategory=, A1 #如果需要显示日志界面,可以将本行启用log4j.roo 阅读全文

posted @ 2012-02-04 22:16 阳光VIP 阅读(399) 评论(0) 推荐(0)

摘要: 去年5月份,公司项目较少,我就组织了一个用于公司内部办公管理的项目(以下称OA)。第一个目的是为了让公司里面一些技术较差的人员得到真正编程的锻炼;第二个目的是为了使用空闲的人员为公司开发一个产品,在内部推行科学管理,以后也可以考虑销售。 结果一直到今年4月份,这个项目才算上线,开发进度一拖再拖,代码质量很差。回过头来考虑原因,有以下几个:1)程序员技术能力弱2)对JSF技术不熟悉3)JSF框架有Bug,并且可用tag较少,不足以应付项目,还需要额外开发自定义tag4)人员变动频繁5)按照<<Software Engineering>>最新版的建议和日立公司开发流程结合指 阅读全文

posted @ 2012-02-04 22:14 阳光VIP 阅读(207) 评论(0) 推荐(0)

摘要: 转自http://www.javabeat.net/javabeat/java7/index.php。此篇文章提供了Java 7.0的新的重要特性介绍。 Java 7.0也是自Java 5.0做重大改变(泛型和并发包)后的又一次重大变化。语言规范将进一步演化(C#演化的太快了)。尤其是闭包(Closures)的引入,使Java语言也能象C# 3.0语言一样便捷的进行Lamda运算。从语言变化上来看,property关键字可能得到支持. 通过闭包,可以进行lamda运算,并进一步简化匿名类的使用。纯XML支持。从API来看,NIO得到进一步提升,持久化框架将被加入到JSE,等等。当然,离Java 阅读全文

posted @ 2012-02-04 22:12 阳光VIP 阅读(219) 评论(0) 推荐(0)

摘要: 最近整理家里,终于搬出我那台7,8年前买的那台台式机,配置如下:1.CPU 赛扬1G2.显卡 i810 (?)3.内存512M4.光驱CD5.显示器 红色无法显示(或许显卡坏了)6. Windows XP反正此机闲着没用,遂想装个Linux玩玩。因为是CD光驱和Fedora 10 DVD安装光盘,所以我做了个ISO镜像,从硬盘安装。安装参考 "从硬盘安装Fedora-9-i386-DVD", 你可以google这篇文章。从晚8点开始安装,安装到0点还在安装packages, 不等了,睡了一觉,大约早上2,3点钟看了一下,发觉才装最后一个kernel包。不过总算装好了。今天回 阅读全文

posted @ 2012-02-04 22:12 阳光VIP 阅读(111) 评论(0) 推荐(0)

摘要: ACE历时20年,耗费数千万美金,在中间件领域享有盛誉。更可贵的是,ACE彻底的开源,且没有任何限制条件,完全是共产主义的精神,让人钦佩。ACE的Wrapper Facade模式解决了夸平台的c++编程问题。虽然我们现在有标准C++,但是目前的C++标准库对于多线程、网络通信、并发处理、进程管理以及小内存分配、共享内存、内存映射文件等诸多实际运用中的问题没有支持。相信随着时间的推移,C++标准库会越来越多的关心我们程序员实际编程中的问题,但是现在,我需要ACE.ACE的文档在http://www.dre.vanderbilt.edu/Doxygen/Stable/ace/index.html, 阅读全文

posted @ 2012-02-04 22:11 阳光VIP 阅读(185) 评论(0) 推荐(0)

摘要: 内存映射文件多个操作系统平台都提供了内存映射文件,这是一个简单的将数据结构保存到文件中的机制。同时由于32位操作系统的进程虚拟内存最大只能4GB,用内存映射文件的方式就可以突破这个限制,可以用来打开超过4GB的大文件。而且,内存映射文件其实就是一种共享内存机制,进程间可以通过共享内存直接访问数据。ACE提供了ACE_MMAP_Memory_Pool类,该类代表了为内存映射文件分配内存的内存池。和ACE_Malloc模板类配合,我们就可以以平台无关的方式操纵内存映射文件了。比如:ACE_Malloc<ACE_MMAP_Memory_Pool,ACE_SYNCH_MUTEX> 。第二个 阅读全文

posted @ 2012-02-04 22:10 阳光VIP 阅读(343) 评论(0) 推荐(0)

摘要: 物价在节节攀升,CPI居高不下,股市损失惨重,房贷似大山压顶......除了提高我们微薄的收入以外,我们还应该从日常的点点滴滴做起,节约每一分Money。流水记账软件就是帮助你提高理财水平,分析你每月的收入和支出,帮助你节省不必要的开支。它使用简便,就像在普通便签本上记录一样简单,可以方便查看历史趋势,打印相应的财务报告。并且,它是一个纯绿色的免费软件,无须联网便能运行。下载 阅读全文

posted @ 2012-02-04 22:09 阳光VIP 阅读(284) 评论(2) 推荐(0)

摘要: 广州国际乒乓赛降下帷幕,最令人注目的男单决赛在王励勤和波尔间展开,最终波尔夺冠。从比赛内容看,很精彩,既有近台的短兵相接,前三板干净利落;又有中 远台飞毛腿导弹你来我往,多回合难分高下,无愧世界第一,第二的称号。总体评价:比正手,比中远台对拉,比力量王胜一筹,但比反手,比近台快攻,比灵活性 波尔胜出,可谓旗鼓相当,各有千秋!对我们业余选手,真是手心手背,鱼与熊掌,狠不能把所有精华集于自身! 到底你是喜欢波尔呢,还是更喜欢王励勤,我想各人的答案不会一样。我这儿想要论证的是:你应该学哪位? 不妨给出我自己的回答:如果你反手好,追求正反均衡,两面弧圈眼花缭乱的,你学波尔;如果你反手不强,突出正手.. 阅读全文

posted @ 2012-02-04 22:09 阳光VIP 阅读(241) 评论(0) 推荐(0)

摘要: 主要要注意的是smtp认证的问题。代码很简单,如下:调用代码:namespace EmailTest{ class Program { static void Main(string[] args) { try { SMTPEmailSender sender = new SMTPEmailSender("mail.longdayinfo.com", "upcodechina@longdayinfo.com", "12345"); sender.From = "upcodechina@longdayinfo.com" 阅读全文

posted @ 2012-02-04 22:08 阳光VIP 阅读(185) 评论(0) 推荐(0)

摘要: Linux下面使用emacs 编写java程序,而不使用eclipse、netbeans等IDE工具,给我一种很酷的感觉。其实最主要的要知道一些细节:1)jdk1.6版本后面运行程序类通常格式如下:java packageName.className并且运行这行命令的当前路径应该在packageName同名目录的外面2)如果两个类同属于一个package,先使用javac编译好一个类A,另一个依赖A的类B编译时用如下命令:javac -d . B.java我使用 了makefile来解决第二个编译问题:JFLAGS = -gJC = javac -d . .SUFFIXES: .java .c 阅读全文

posted @ 2012-02-04 22:07 阳光VIP 阅读(289) 评论(0) 推荐(0)

摘要: 作为万类之首的Object类,我们有必要详细全面的了解一下。Object类定义在Object.java文件,属于包java.lang。 Object类有一个私有方法private static native void registerNatives(). native是java语言的一个关键字.使用native关键字说明这个方法是原生函数,也就是这个方法是用C/C++语言实现的,并且被编译成了DLL,由java去调用.JDK的源代码中并不包含这些函数的实现体,你应该是看不到的。对于不同的平台它们也是不同的。这也是java的底层机制,实际上java就是在不同的平台上调用不同的native方法实现 阅读全文

posted @ 2012-02-04 22:06 阳光VIP 阅读(161) 评论(0) 推荐(0)

摘要: 安装NetBeans 我的操作系统是Fedora7,操作系统自带Eclipse,但是由于缺少Java运行库,所以只能运行,不能调试。为了简单起见,我去Sun公司网站下载了NetBeans5.5.1(带JDK),文件名称为:jdk-6u2-nb-5_5_1-linux-ml.bin,大小为143072256 字节。 安装很简单,先执行chmod +xjdk-6u2-nb-5_5_1-linux-ml.bin,然后运行bin文件即可。会出现一个图形安装向导,跟着向导安装,很简单。 你可以在Applications->Programming下找到NetBeans的启动菜单,也可以执行下面的命令 阅读全文

posted @ 2012-02-04 22:06 阳光VIP 阅读(114) 评论(0) 推荐(0)

摘要: 构造函数是java类的最传统创建方式,除此之外,我们还可以选择经典的设计模式,经典的创建型设计模式包含了四种,factory,abstract factory,singleton和prototype。另外,在java中还有一种经常使用的模式---静态工厂方法(我们可以认为这是创建型模式的一种新的补充)。 什么是静态工厂方法?其实很简单,也就是类的设计者将构造函数设计为保护的或者私有的,而提供静态成员函数负责返回给客户已经创建好的对象。这样做有什么优点呢?1)首先引入了静态函数,增加了间接性,这样也就带来了灵活性,这一点和其他的创建型模式一样。设计者可在内部创建单例对象,也可以预先创建,以提高性 阅读全文

posted @ 2012-02-04 22:05 阳光VIP 阅读(96) 评论(0) 推荐(0)

摘要: 如果我们对预定义类型使用==或者!=,就是值比较;如果我们对自定义类型的两个变量(引用)使用==或者!=,就是引用比较,也就是只比较内存地址。我们也可以调用自定义类型的equals方法进行比较。由于所有的自定义类型都是从Object派生,而Object类已经实现了equals方法,而这种默认的实现实际上就是引用比较,如果我们的自定义类需要提供值比较的语义,就需要重写该函数,并且在文档中说明。因此,我们不能简单理解为equales就是值比较,在某些情况下默认继承而来的引用比较更加符合某些场合的应用。String类型的equals提供了值比较的语义,比如:String str1=new Strin 阅读全文

posted @ 2012-02-04 22:05 阳光VIP 阅读(442) 评论(0) 推荐(0)

摘要: 匿名内部类,比如下面函数内部initialize定义了两个匿名类(红色代码部分): publicsynchronizedvoid initialize(Environment env, Detector detector, DaemonListener listener, PlainLogger[] loggers) throws NullPointerException, IllegalStateException { if (fInitialized) { return; } Helper.notNull( env, "environment" ); Helper.no 阅读全文

posted @ 2012-02-04 22:04 阳光VIP 阅读(139) 评论(0) 推荐(0)

摘要: C++中有多继承,多继承很好,但是c++多重继承中,派生类继承了所有父类的实现,导致体积膨胀等缺点。C#和java的设计者坚持单继承,所有的类都派生自Object类,他们提供了interface来模仿c++的多继承(java里称为mixing—混合类型), 既利用了多继承的好处,又因为接口不包含任何方法实现和非静态成员变量,因而没有c++多重继承带来的困扰。 interface只能声明方法,不能实现方法。抽象类则可以实现方法,但是不能用于多继承。一个类可以扩展另一个类,同时又实现其它接口;一个接口也可以扩展自两个不同的接口。下面就是一个示例:publicclass MyInteger2 ext 阅读全文

posted @ 2012-02-04 22:04 阳光VIP 阅读(68) 评论(0) 推荐(0)

摘要: final的字面意思是指无法改变,但是不同的情况下使用,会有些许区别final成员变量当final修饰一个类的成员变量时,表示该成员变量是常量,这句话需要解释一下:如果该成员变量的类型是预定义类型,说明该变量值不可修改;如果该成员变量的类型是自定义类型,则该变量只是引用,那么该引用不能再指向别的对象,而对象的值却是可以修改的。 注意:1)当我们使用static final+预定义类型变量来表示一个静态常量的时候,变量名应该全部用大写字母,并且单词之间用下划线分隔。 2)使用final修饰的成员变量一定要立刻初始化其值。final参数 final修饰形式参数,意味着函数内部不可以让参数引用其它的 阅读全文

posted @ 2012-02-04 22:04 阳光VIP 阅读(148) 评论(0) 推荐(0)

摘要: Serializable实现Serializable接口 这是最简单的序列化方式。下面的例子将类的内容写到文件中,然后再反序列化声称新的对象。public class MyClass implements Serializable{ private String name; private int value; public MyClass(String name,int value) { this.name=name; this.value=value; } public static void main(String[] args) throws ClassNotFoundExcept.. 阅读全文

posted @ 2012-02-04 22:03 阳光VIP 阅读(144) 评论(0) 推荐(0)

摘要: 1)实现Cloneable接口,因为Object的clone方法将检查类是否实现了Cloneable接口,如果没有将抛出异常CloneNotSupportedException对象。Cloneable接口没有任何方法,只是个标志,所以只需要简单得写上implements Cloneable即可。2)改写从Object继承而来的clone方法,使它的访问权限为public,因为为了防止意外的支持clone操作,Object的clone方法是protected权限。3)在clone方法中,调用super.clone()方法。Object的clone方法能够按照旧对象的大小创建足够的内存空间,并按位 阅读全文

posted @ 2012-02-04 22:03 阳光VIP 阅读(141) 评论(0) 推荐(0)

摘要: Swing是什么 Swing属于JFC(Java Foundation Classes)的一部分。JFC包含了AWT,Swing,辅助功能API,Java2D,拖放。Swing的出现是为了解决AWT(Abastract Window Toolkit)的移植性和提供更多的企业级应用程序所需要的功能。Swing建立在核心AWT库上,JDK1.2以及更高的版本已经包含了Swing库。 Swing内部采用了MVC体系结构(modle-view-controller)。modle负责存放Swing组件的状态(数据),controller负责处理事件,view负责绘制图形。Swing使用了简化的MVC变体 阅读全文

posted @ 2012-02-04 22:02 阳光VIP 阅读(572) 评论(0) 推荐(0)

摘要: 定义 JavaBean的定义:根据Sun的JavaBean规范,一个bean就是一个可重用的软件构件、并能够在开发工具中可视化的操作。创建JavaBean JavaBean规范没有要求一个JavaBean类都必须有默认构造函数,但是大多数开发工具都有这样的要求,所以这成为了一个事实上的标准。所以,如果一个Java类要成为JavaBean,就需要提供一个默认构造函数。 JavaBean通过提供get/set方法来读取或者设置属性。 JavaBean通常需要支持序列化功能。一般是实现Serializable或者Externalizable接口。请参见序列化一节。 通过NetBeans创建JavaB 阅读全文

posted @ 2012-02-04 22:02 阳光VIP 阅读(169) 评论(0) 推荐(0)

摘要: 标准异常的层次结构 Java标准异常的层次结构代表的分类绝对是一个败笔。因为所有的异常对象都是在运行时抛出的,没听说过有什么编译期异常。因此RuntimeException类代表的实际上是逻辑错误导致的异常,即标准c++中的std::logical_error。 Java异常分为两大类,程序员只能抛出Exception异常对象,Error对象是Java系统在内部发生错误或者资源耗尽时才抛出的。 还有另外一种分类方法,Error和RuntimeException对象被称为unchecked exception,其他的则被称为checked exception,也就是说java编译器将对check 阅读全文

posted @ 2012-02-04 22:02 阳光VIP 阅读(150) 评论(0) 推荐(0)

摘要: Observable类 这是位于jdk包java.util中的类,该类实现了简单的Observer模式中的ConcreateSubject角色。Observable类使用Vector保存一组Observer的引用。提供了添加和删除这些Observer引用的方法: publicsynchronizedvoid addObserver(Observer o)//添加一个Observer publicsynchronizedvoid deleteObserver(Observer o)//删除一个Observer publicsynchronizedvoid deleteObservers()//删 阅读全文

posted @ 2012-02-04 22:01 阳光VIP 阅读(96) 评论(0) 推荐(0)

摘要: 1)从http://sourceforge.net/project/showfiles.php?group_id=109071中下在WTL8.0的Release包WTL80.exe2)执行WTL80.exe,按照默认路径解压到C:/WTL80目录3)命令行中运行C:/WTL80/AppWiz/setup80.js 脚本,这个脚本负责创建VC2005使用的WTL向导文件4)现在可以开始使用VC2005编程了,注意工程的C++和Resource属性Additional Include Directories设置为C:/WTL80/include。Debug和Release模式都要设置。如果是vc6 阅读全文

posted @ 2012-02-04 22:00 阳光VIP 阅读(146) 评论(0) 推荐(0)

摘要: 通过request对象 request对象的类型为HttpServletRequest。在JSP翻译成的Java类中,有这样的函数:public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException 当客户请求到达服务器时,该函数将被调用。该函数负责生成并输出客户请求的html代码。HttpServletRequest是一个接口,扩展自ServletRequest接口。该接口提供了一系列方法,主要用于http. 阅读全文

posted @ 2012-02-04 22:00 阳光VIP 阅读(584) 评论(0) 推荐(0)

摘要: 智能指针类auto_ptr 98 C++标准只规定了一个智能指针,就是template <class Type>class auto_ptr 下面是示例代码:#include <memory>using namespace std;int _tmain(int argc, _TCHAR* argv[]){ auto_ptr<string> spString(new string("hello,world")); size_t length=spString->length(); return 0;} 模板参数Type是auto_pt 阅读全文

posted @ 2012-02-04 21:59 阳光VIP 阅读(187) 评论(0) 推荐(0)

摘要: WM_CONTEXTMENU消息会在右键点击窗口客户区的时候发出,通过处理该消息,我们可以在此时弹出上下文菜单。 我们可以添加一个菜单资源。如下图: 我们利用CMainFrame的成员变量CCommandBarCtrl m_CmdBar来显示我们的上下文菜单。LRESULT CMainFrame::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled){ CMenu menu; menu.LoadMenu(IDR_MENU1); CMenuHandle menuPopup = menu.GetSubM 阅读全文

posted @ 2012-02-04 21:59 阳光VIP 阅读(266) 评论(0) 推荐(0)

摘要: 基本知识程序做错误检查是必要的,通常我们可以通过返回值告诉客户有了错误,不过异常提供了更加方便的手段和丰富的信息。当某处程序发现了错误,可以选择自己处理或者交给外部调用者处理,比如:void Func(char* p){if(p==NULL){throw std::invalid_argument(“p is NULL”);}}而调用者可以选择拦截该异常对象或者放过,交由更外层的逻辑处理。try{Func(NULL);}catch(std::invalid_argument const& e){cout<<e.what()<<endl;throw;}这个例子中, 阅读全文

posted @ 2012-02-04 21:58 阳光VIP 阅读(152) 评论(0) 推荐(0)

摘要: Function Objects函数对象的定义:可以使用函数调用语法进行调用的任何对象。如果一个类或者结构A实现了ResultType operator()(Parameters)方法(即重载了函数调用操作符),当客户编写代码如A()时,其实就是通过默认构造函数创建了A的对象,然后调用上面的这个operator()方法。函数对象拥有几个优点:1)因为函数对象可以有成员变量,因此可以在构造函数中初始化成员变量,因此与一般函数相比,函数对象拥有状态。这主要带来的是灵活性。比如函数Func接受一个函数对象的引用A,然后调用A(),客户可以预先创建不同的函数对象,比如A(1),A(2)(假设A类构造函 阅读全文

posted @ 2012-02-04 21:57 阳光VIP 阅读(131) 评论(0) 推荐(0)

摘要: STL容器顺序容器顺序容器将单一类型的元素聚集起来,然后根据位置来存储和访问这些元素。顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定。STL中最常用的顺序容器是vector、list、deque。在这里,我不打算介绍如何使用这些容器类的基本函数,这将作为课后作业。我把篇幅放在如何选择使用这三种容器上。vector<>vector被称为动态数组,原始的静态数组一旦越界可能会悄无声息的修改掉不该修改的内存,而vector会立即出错,抛出异常。vector具备动态增长的能力,如果空间不够,vector会创建一块更大的连续空间,然后将原来的数据搬迁到新的空间中。vec 阅读全文

posted @ 2012-02-04 21:57 阳光VIP 阅读(152) 评论(0) 推荐(0)

摘要: 性能优化Linux下程序性能分析工具gprofgprof 安装在Linux 系统的 /usr/bin 目录下. 它能剖析你的程序,并分析出程序的哪一个部分在执行时最费时间.gprof 将告诉你程序里每个函数被调用的次数和每个函数执行时所占时间的百分比. 你如 果想提高你的程序性能的话这些信息非常有用.为了在你的程序上使用 gprof, 你必须在编译程序时加上 -pg 选项. 这将使程序在每次 执行时产生一个叫 gmon.out 的文件. gprof 用这个文件产生剖析信息.在你运行了你的程序并产生了 gmon.out 文件后你能用下面的命令获得剖析信息:gprof <program_na 阅读全文

posted @ 2012-02-04 21:56 阳光VIP 阅读(166) 评论(0) 推荐(0)

摘要: 多线程信号驱动I/0和异步I/0的区别信号驱动I/0是指进程预先告知内核,使得当某个描述字上发生某事时,内核使用信号通知相关进程。异步I/0是进程执行I/0系统调用(比如读或者写),内核启动I/0操作后立刻返回进程,进程可以在I/0操作执行期间继续处理别的事情,然后当I/0操作成功或者失败时,内核以进程预先设定的方式通知进程。使用锁保护同步数据的原则多个线程使用同一个数据,必须保护该数据;如果多个线程共用一个基础类型变量,应该声明为volatile,防止编译器使用将其缓存到寄存器内的优化方式;共享的整数变量应该优先使用原子操作来修改其值;有时候,可以考虑将某些需要共享的数据只让一个单独线程处理 阅读全文

posted @ 2012-02-04 21:56 阳光VIP 阅读(142) 评论(0) 推荐(0)

摘要: 该程序将演示如何将一个简单结构序列化后发送到网络上,如何从网络上接收到数据后反序列化回结构。 ACE的 C++ WRAPPER FACADE层将网络通信分成三种角色:连接者 (ACE_SOCK_Connector)、等待者 (ACE_SOCK_Acceptor)和传输者 (ACE_SOCK_Stream)。建立连接 首先使用 ACE_SOCK_Connector::connect连接某个服务器(使用 ip地址和端口号),该服务器上使用 ACE_SOCK_Acceptor::accept等待外部的连接请求。 ACE_INET_Addr类进行管理 SOCKET通信使用的 IP地址和端口号。 当连接 阅读全文

posted @ 2012-02-04 21:55 阳光VIP 阅读(200) 评论(0) 推荐(0)

摘要: Linux编程环境时间日期类型timeval 及其相关API“时间”和“日期”的概念,主要有以下几个:Coordinated Universal Time(UTC):协调世界时,又称为世界标准时间,也就是大家所熟知的格林威治标准时间(Greenwich Mean Time,GMT)。比如,中国内地的时间与UTC的时差为+8,也就是UTC+8。美国是UTC-5。Calendar Time:日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来说,这个标准时间点是不变的,该编译系统中的时间对应的日历时间都通过该标准时间点 阅读全文

posted @ 2012-02-04 21:55 阳光VIP 阅读(162) 评论(0) 推荐(0)

摘要: 算法排序算法Selection Sort连续的容器中存放了很多的元素,我们需要对其进行排序,假设每个元素都支持operator <运算符。选择排序的做法是先选择第一个元素,然后和其他的n-1个元素逐一比较,找到n-1个当中最小的,并且同时小于第一个元素的,交换位置。然后用同样的算法考虑后面的n-1、n-2、n-3...个元素,直到还剩下最后一个元素。template<typename T>void SelectionSort(T a[],size_t length){assert(length>1);size_t curPos=0,minPos,end=length;w 阅读全文

posted @ 2012-02-04 21:54 阳光VIP 阅读(162) 评论(0) 推荐(0)

摘要: Windows下,每个线程都可以拥有一个消息队列,通常UI线程默认就拥有自己的消息队列,Work Thread需要自己调用PeekMessage来创建自己的消息队列。 消息是一个数据结构,下面是它的定义:typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt;#ifdef _MAC DWORD lPrivate;#endif} MSG 每个消息都包含了要接收消息的窗口的句柄,消息ID,两个参数,还有其他信息。SDK下的消息循环通常这样写:while ( 阅读全文

posted @ 2012-02-04 21:53 阳光VIP 阅读(196) 评论(0) 推荐(0)

摘要: Form窗口实际上就是派生自对话框类CDialogImpl类。因为也有一个对话框资源,所以我们可以使用可视化编辑的方式添加控件。class CFormView : public CDialogImpl<CFormView>{public: enum { IDD = IDD_FORM_FORM }; BOOL PreTranslateMessage(MSG* pMsg) { return CWindow::IsDialogMessage(pMsg); } BEGIN_MSG_MAP(CFormView) END_MSG_MAP()}; 注意当手动添加对话框资源时,需要将Border属 阅读全文

posted @ 2012-02-04 21:52 阳光VIP 阅读(133) 评论(0) 推荐(0)

摘要: 下面是我通过使用向导生成的代码:class CDemoView : public CWindowImpl<CDemoView, CTreeViewCtrl>{public: DECLARE_WND_SUPERCLASS(NULL, CTreeViewCtrl::GetWndClassName()) BOOL PreTranslateMessage(MSG* pMsg) { pMsg; return FALSE; } BEGIN_MSG_MAP(CDemoView) END_MSG_MAP()}; 注意和普通窗口的区别:1)CWindowImpl第二个木板参数为CTreeViewCt 阅读全文

posted @ 2012-02-04 21:52 阳光VIP 阅读(100) 评论(0) 推荐(0)

摘要: WTL提供了3个类用来分隔窗口:CSplitterImpl、CSplitterWindowImpl、CSplitterWindowT。CSplitterImpl类实现了最主要的分割窗口所需要的函数。CSplitterWindowImpl继承了CSplitterImpl类,它实现了一个什么都不做的OnEraseBackground函数,还实现了一个OnSize函数,该函数可以自动调整分割窗口的客户区大小。通常情况下,我们可以直接使用CSplitterWindowImpl类作为我们窗口的父类,如果这两个函数的行为达不到我们的要求,我们可以改写继承自CSplitterImpl类的消息处理函数。CSp 阅读全文

posted @ 2012-02-04 21:52 阳光VIP 阅读(318) 评论(0) 推荐(0)

摘要: 如何让整个窗口具有透明效果呢? 使用如下的类:// class CLayeredImpl// Layered Windowtemplate <class T>class ATL_NO_VTABLE CLayeredImpl{public: HMODULE m_hUser32LWA; CLayeredImpl() { } virtual ~CLayeredImpl() { } LONG SetLayeredStyle() { T* pT = static_cast<T*>(this); ATLASSERT(::IsWindow(pT->m_hWnd)); LONG 阅读全文

posted @ 2012-02-04 21:51 阳光VIP 阅读(205) 评论(0) 推荐(0)

摘要: 如何改变窗口的背景色,但是不影响OnPaint函数内部的绘图逻辑呢?举例:LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) { // handled, no background painting needed CPaintDC dc(m_hWnd); RECT rect; GetClientRect(&rect); CBrush brush; brush.CreateSolidBrush(RGB(255,134,255)); dc.Fil 阅读全文

posted @ 2012-02-04 21:51 阳光VIP 阅读(207) 评论(0) 推荐(0)

摘要: WTL7.5在VC8中的使用简单剖析目录前言... 1WTL7.5安装... 1WTL 对话框... 2WTL窗口... 5SDI窗口... 5MDI窗口... 7进程入口---_tWinMain. 8前言 我看了很多关于MFC/ATL/COM方面的书,我发现国外的技术作者大多喜好挖掘代码内部最晦涩难懂的精华部分,试图解释给读者,当然我非常感激,我也因此受益匪浅。但是常常发现当我在钻研技术底层的时候,容易迷失了方向,搞不清这些东西做什么用。我常常想,写书的人,在每每挖掘内核的时候,总是能在一开始提纲携领的描述一下我们要做什么,可能效果好得多。但是也许那些人实在站在比我高得太多的山巅上,那些在他 阅读全文

posted @ 2012-02-04 21:50 阳光VIP 阅读(265) 评论(0) 推荐(0)

摘要: 虚函数的内存布局一个拥有虚函数的类内部会有一个成员变量vptr,一个四字节大小的指针,指向虚函数表,虚函数表中记录了该类的各个虚函数的入口地址,如果该类重载了继承的虚函数,那么就存放自己的虚函数地址,否则就是父类的虚函数地址。class A{public: virtual void f(){}; virtual ~A(){};};class B:public A{ void f(){int i=0;};};A* pA=new B();pA->f();对于f的调用操作编译器有如下动作:void B::f()函数解释为void f(B* this);pA->f()解释为 (*pA-&g 阅读全文

posted @ 2012-02-04 21:49 阳光VIP 阅读(225) 评论(0) 推荐(0)

摘要: 1)使用wsdl2h命令,从wsdl文件中提取web service的信息到.h文件中wsdl2h c:/gsoaptemp/DataService.wsdl我的电脑是WinXP sp2,-o参数无效,并且wsdl文件也不能通过指定url来获取2)使用soapcpp2命令,编译刚才生成的.h文件中,产生代理类以及其他文件比如:DataServiceSoap.nsmap、soapC.cpp、soapClient.cpp、soapClientLib.cpp、soapDataServiceSoapProxy.h、soapStub.h3)建立vc8工程,注意引入wsock32.lib库文件,其余头文件 阅读全文

posted @ 2012-02-04 21:49 阳光VIP 阅读(132) 评论(0) 推荐(0)

摘要: 析构函数如果一个类想被别人继承,通常析构函数要声明为虚函数,否则,如下代码就会出现未定义情况。Base* p=new Derived();delete p;这句话反过来说,就是如果你不打算让别人派生你的类,就不要把析构函数声明为虚函数,当然对方是菜鸟的话,你也没办法。极端特殊情况下,只要使用者保证不会多态的析构(像上面的例子),也可以通融。继承与访问权限基类的private成员,只能由基类或者基类的友元访问,也就是说既不能被类外部的调用者(客户)访问,也不能被子类访问。或许是提供一种相对宽松的选择,protected成员允许派生类访问,但是拒绝外部调用者的访问。<<C++Prime 阅读全文

posted @ 2012-02-04 21:39 阳光VIP 阅读(153) 评论(0) 推荐(0)