线程池相关链接

http://www.pudn.com/downloads46/sourcecode/windows/network/detail155206.html

http://www.pudn.com/downloads117/sourcecode/windows/network/detail498767.html

http://blog.csdn.net/ishow99/article/details/4921739

 

 

  先要做的是修正一下第一步里面一点错误,首先,最新的poco已经支持对express的Visual Studio 2008/2010了,这是一个好消息,这意味着在windows上面我们就有免费工具使用poco了。

 

  其次要做的,是一点补充,关于编译方面。需要说一下的是,用build_vs71.cmd(或者其他什么build_vs*.cmd)编译,其本质仍然是用Visual C++编译,只不过改成了命令行执行而已。以 build_vs71.cmd为例,打开以后,里面只有一行是buildwin ...,然后,我们打开buildwin.cmd,在里面就很复杂的一大票东西——就是windows批处理脚本,但是只要注意一个变量%BUILD_TOOL%就可以了,在文件第一行定义的就有:

set BUILD_TOOL=devenv

devenv就是Visual C++执行命令行编译的命令。在整个文件前面很多if判断就是检查需要执行什么类型的编译(debug/release...),然后就开始用BUILD_TOOL进行编译。

 

  对于使用vcproj项目文件来编译poco就是一个Visual C++工程文件进行编译,但是它的几个选项,可能需要解释一下:debug_shared/release_shared,这个没什么说的,就是调试或者发布版本,使用的poco库是动态链接库;static_mt/static_md,这个的区别就有点费解,其中前面的debug/release_static很清楚,后面的mt/md区别在于对C/C++ runtime库的链接方式,mt表示用静态方式链接C/C++ runtime库,md表示用动态方式链接C/C++ runtime库,比如,debug_static_mt的意思是调试版本,使用静态poco库,链接C/C++ runtime库使用静态方式,其他亦然。


更多关于C/C++ runtime库的知识:

关于C/C++ runtime库编译选项设置的详细而权威的官方介绍:http://msdn.microsoft.com/en-us/library/abx4dbyh(v=VS.71).aspx 

为什么和怎么选择正确的C/C++ runtime库:http://www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html


  好了,这些东西知道就可以了,刚刚入门的时候就用debug_shared模式就可以了,等用的多了,再认真区别。

在程序当中使用poco库

  以VS2003.net的Windows Console工程为例,创建起来以后,需要修改下面这些配置,才可以开始在程序里面使用poco库的函数或者类:

  1、菜单Project - Properties,打开项目的Properties Pages窗体,在Configuration Properties - C/C++ - Code Generation当中的Runtime Library选项修改成为Muti-threaded DLL (MD)。这个选项默认的是单线程的,只要改成任意一个多线程选项就可以了,不做修改是无法编译通过的。

  2、菜单Project - Properties,打开项目的Properties Pages窗体,在Configuration Properties - C/C++ - General当中的Additional Include Directories当中,填写上poco的include文件夹。比如你的poco放在了c:\poco目录下面,那么你需要写上c:\poco\poco-1.4.0\Foundation\include。这个选项是设置引用的库对应头文件所在位置,编译器会把这个目录放在寻找头文件的目录候选当中。

  3、菜单Project - Properties,打开项目的Properties Pages窗体,在Configuration Properties - Linker - General当中的Additonal Library Directories当中,填写上poco的lib文件夹,如上条的例子,你应该写c:\poco\poco-1.4.0\lib。这个选项设置了库文件所在目录。

  4、菜单Project - Properties,打开项目的Properties Pages窗体,在Configuration Properties - Linker - Input当中的Additional Input Files当中,填写上你要调用的poco库文件。在这里我们要调用一个字符串处理函数,它在库PocoFoundation.lib当中,所以就填这个就可以了。

  5、把PocoFoundation.lib对应的dll文件复制到项目文件夹,它在poco的bin目录下面,名字就是PocoFoundation.dll。这是因为我们编译用的是debug shared模式,可执行代码里面并没有poco的二进制码,在需要调用poco函数的时候,它就会按照一定的候选目录顺序去对应的dll里面找,项目文件夹是第一个候选目录,所以我们把对应的dll放在这里。

当然,做这一切的前提是:你已经成功的编译了poco的debug shared版本。

 

  下面,把这些代码输入到main.cpp(你的工程里应该只有这一个文件)当中:

#include "Poco/String.h"

#include <string>

#incude <iostream>

int main(int argc, char** argv)

{

std::string s0("          Hello, world!        ");

std::string s1 = Poco::trim::trim(s0));

std::cout << s0 << std::endl;

std::cout << s1 << std::endl;

return 0;

}

 

  在这个程序里面,我们调用了一个poco的函数trim,它的功能就是把字符串两端的空格去除掉,然后我们输出去除以前和以后的字符串看看效果。编译通过以后,执行程序,就完成了(应该很顺利,如果你按照上述步骤还遇到问题了,请跟帖)。对于poco当中的单个函数,也可以采用类似的方式进行调用。

 

一点解释:

  1、Poco/String.h是包含了trim的头文件,关于函数trim的更多详细说明,或者更多类似trim函数的说明,请参考poco的文档:http://pocoproject.org/docs/

  2、如果你下载了poco的官方文档,里面也有关于trim的例子,也很简单,但是有一点区别就是官方文档的代码没有#include <string>,这个是因为在头文件Poco/String.h里面通过其他抓出poco头文件引用过了,所以不添加也可以(我原来不知道这一点)。个人以为加上好点,清楚。

  3、Poco::trim::trim函数就在头文件Poco/String.h当中,是用模板定义的。本来只要引用了头文件就可以用,不需要一二三四五的设置一大堆,但是由于间接引用了其他头文件(Poco/Foundation.h),不得不如此。有点可惜,如果能做到只引用头文件就可以使用函数就好了,杀鸡杀牛一样方便灵活,但是现在的做法是杀鸡不得不用牛刀。

  4、在前面第二条设置头文件路径的时候,必须设置到include,不能是inlcude/Poco;相同原因,我们引用的时候,必须是Poco/String.h,而不能是String.h。因为在poco内部的头文件互相引用的时候就是基于目录include而不是include/Poco的。

  5、注意大小写不要搞错,即使是include里面也不能错,因为并不是所有的操作系统都不区分大小写字母的。如果大小写混淆了,会牺牲poco的可移植性(这本来就是poco的一个很大的优点)。

 

  到这里,我们已经可以在工程当中使用一个简单的poco函数,虽然例子是VS2003.net的Console工程,但是对于其他版本的vs下的其他工程,也是类似的配置方法。下一步,我会介绍一下poco的各个功能和优点,解释一下为什么要用poco。

 

 

 

C++本身浩如烟海,C++的库更渺如云烟,几乎各个方面都没有落下,那么,为什么我们要用poco呢?

  首先一个原因,就是poco自己所说的:“Modern, powerful open source C++ class libraries and frameworks for building network- and internet-based applications that run on desktop, server and embedded systems.” —— 一个现代化、功能强劲的开源C++类库和框架,它可以用来创建在桌面、服务器和嵌入式系统上运行的网络应用和因特网应用。

  现代化,C++的年龄作为一个人才刚刚一个步入而立之年,但是作为一门语言,嗯……在Java / C#的历史当中,C++是作为史前动物出现的。那么,所谓的现代化,就是说这门语言可以像史前动物一样迟缓笨重,也可以像未来战士一样炫丽敏捷,但是无论史前与未来,它永远强大。什么样的C++类库不是现代化的?你可以打开MFC的源代码看看,到处都是丑陋的宏定义,宏起了它应该的作用,也做了它职责以外的事情,比如下面:

void CDiaTemplateEdit::DoDataExchange(CDataExchange* pDX)

{

    CDialog::DoDataExchange(pDX);

    DDX_Text(pDX, IDC_EDIT_NAME, tempAftEdit);

    DDX_Text(pDX, IDC_EDIT_COTENT, tempBefEdit);

}

程序员必须谨小慎微,否则就会遇到意想不到的问题——花大力气搞清楚宏会怎么扩展——然后怎么嵌套扩展……当然,MFC的宏是很有规则的,但是再好的恐龙,也不会比一只猴子敏捷。

但是你打开poco C++的代码,会发现namespace把代码整齐的规制的分门别类,从函数到模板,一切实现简洁明了,整个架构仿佛数学理论一样严密。这就是现代化的C++代码特征。这里倒不是说MFC不高明,而是时代所限,在MFC的年代C++编译器和标准化程度还远不如现在发达,引入那么多宏也是无可奈何之举;而poco能现在这样写出漂亮的代码,也和C++编译器的进化和标准化程度的提高有关,当然和作者本人更是有根本的关系。

  作为功能强大,个人觉得这方面poco并没有给我留下特别深刻的印象,因为C++自己就是功能强大,而功能强大的类库也是挺多的。不过要说Poco是一个功能强大和方便使用的类库,确实更加有特色。在最开始我们配置Poco工程虽然有五个步骤的配置,但是都是和编译器相关的,而不是类库本身造成的原因,可以说Poco基本上是一个拿来就能用的类库,而且要调用它的功能,也并不困难(这也说明Poco在设计上很有功力,能把强大的功能设计的易于使用),这一点,在后面介绍如何使用poco的时候,会更多的介绍到。

  对我个人而言,Poco是一个让C++有了类似VB或者Delphi一样友好编程接口的类库。

  还有一个不能不提的优点,和Poco名字的来历相关,Po两个字母就是来自Protable,可移植。Poco是一个可以在Windows/Linux上都可以编译的类库,可以用在服务器到嵌入式设备当中——说实话,我还只在Windows上用过,如果说XP到Win7算跨平台的话,那我也算体会过Poco的跨平台特性了。

  总之,Poco C++的优点就在于语言优美,体现了C++的特征;功能强大又方便使用;可移植性好。

 

 

 

Poco: 字符串处理(一)

这不是一个严谨的教材,同样,由于Poco的简洁好用,它也不需要一个严谨的教材。这是根据我当时使用的需要整理出的材料,当时我是先使用正则表达式,所以就从字符串开始吧。字符串部分,主要是依据Poco网站提供的一个PDF格式教材幻灯片来的(翻译 + 少量分析)。

头文件

  #include "Poco/String.h"

概述

  所有Poco的函数,都是适用于std::string和std::wstring两种类型字符串的。

  都放在名字空间Poco里面,也就是说,如果你要使用Poco提供的函数toUpper,要么using namespace Poco,要么采用Poco::toUpper的形式;

  都有两种形式:对被处理的字符串不做修改,而是把结果放在另外一个字符串里面;或者直接把修改以后的结果放在传入的字符串里面,其中的后者叫做InPlace模式,对应的标记是在函数名字后面有一个InPlace的后缀。比如函数S toUpper(const S&),它还有个对应的函数是S& toUpperInPlace(S&),区别在于对于传入参数toUpper是不修改的,返回值是另外一个字符串;而函数toUpperInplace则会修改传入参数,返回值还是传入参数本身。

 

函数

std::[w]string trimLeft(const std::[w]string& str) 返回str的一个删除了开头所有空白字符的拷贝。

std::[w]string& trimLeftInPlace(std::[w]string& str) 删除开头所有空白字符以后返回str本身。

std::[w]string trimRight(const std::[w]string& str) 类似trimLeft,删除结尾处空白字符

std::[w]string trimRightInPlace(std::[w]string& str) 类似trimLeftInPlace,删除结尾处空白字符

std::[w]string trim(const std::[w]string& str) 类似trimLeft,删除头尾空白字符

std::[w]string trimInPlace(std::[w]string& str) 类似trimLeftInPlace,删除头尾空白字符

  这里的空白字符,包括空格、制表符、回车、换行等字符,0x09 - 0xD和0x20都认为是空白字符。它的没有一个一个的比较,而是对每一个字符(总共128个,因为std::string/wstring的性质都决定在这128个字符)赋了一个属性值,然后用与操作来获取这个属性,这样就不需要对空白字符逐个判断,只要一次判断就可以了。具体可以参考函数Ascii::properties。

待续>>>

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值