热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

POCOC++Libraies介绍及常见用法

POCOCLibraies属于功能广泛、轻量级别的开源框架库,它拥有媲美Boost库的功能以及较小的体积广泛应用在物联网平台、工业自动化等领域。POCOCLibrai

  POCO C++ Libraies属于功能广泛、轻量级别的开源框架库,它拥有媲美Boost库的功能以及较小的体积广泛应用在物联网平台、工业自动化等领域。

  POCO C++ Libraies由多个功能模块组成,其中包括网络、多线程、日志、命令行程序等。POCO官方拥有众多模块的使用示例,可以在短时间内上手并完成相关功能。

  官方网址:POCO官方
  官方文档:POCO文档
  函数用法:POCO函数用法




章节预览:

介绍(引自官方)
PocoNet
HTTP(TCP)服务器启动方式
HTTP(UDP)服务器启动方式
HTTP客户端编写方式
方法调用
DNS域名解析方式
PocoFoundation
Poco 日志(封装后的函数)
Poco 日志用法
Poco 智能指针用法
Poco json相关用法
Poco 获取当前时间
Poco 线程池用法
Poco 互斥锁用法
Poco 智能锁
Poco 智能锁用法
PocoUtil
Poco 控制台程序
Poco 控制台程序启动方式




章节内容:




介绍(引自官方):

  POCO C++库是开源C++类库的集合,这些库简化并加速了C++中以网络为中心的可移植应用程序的开发。这些库与C++标准库完美集成,并填补了它遗留的许多功能空白。它们的模块化,高效的设计和实现使POCO C++库非常适合嵌入式开发,因为C++编程语言同时适用于底层(设备I / O,中断处理程序等),因此C++编程语言正变得越来越流行。 。)和高级面向对象的开发。当然,POCO也已准备好应对企业级挑战。

  POCO由四个核心库和许多附加库组成。核心库是Foundation,XML,Util和Net。附加库中的两个是NetSSL(为Net库中的网络类提供SSL支持)和Data(一个用于统一访问不同SQL数据库的库)。POCO旨在实现以网络为中心的跨平台C++软件开发,而Apple的Cocoa则是用于Mac开发,而Ruby on Rails则是用于Web开发,这是一个功能强大且易于使用的有趣平台,可用于构建您的应用程序。POCO严格使用标准ANSI / ISO C++(包括标准库)构建。贡献者试图在使用高级C++功能与保持类可理解以及代码干净,一致和易于维护之间找到一个良好的平衡。




PocoNet:

  介绍:

    PocoNet属于网络相关框架,集成功能有:
      HTTP(TCP)服务器及客户端,HTTP(UDP)服务器以及DNS域名解析等。

    PocoNet常用头定义及命名空间:

      #include “Poco/Net/SocketAddress.h”
      #include “Poco/Net/StreamSocket.h”
      #include “Poco/Net/SocketStream.h”
      #include “Poco/StreamCopier.h”
      #include “Poco/Net/DNS.h”
      using Poco::Net::DNS;
      using Poco::Net::IPAddress;
      using Poco::Net::HostEntry;



    使用PocoNet框架需要包含库名:

      PocoFoundation
      PocoNet




  HTTP(TCP)服务器启动方式:

Poco::Net::ServerSocket srv("www.test.com",8080);
for ( ; ; )
{Poco::Net::StreamSocket ss &#61; srv.acceptConnection();Poco::Net::SocketStream str(ss);str <<"HTTP/1.0 200 OK\r\n""Content-Type: text/html\r\n""\r\n""""

Hello world

"<}



  HTTP(UDP)服务器启动方式&#xff1a;

Poco::Net::SocketAddress socketAddress("www.test.com",8080);
Poco::Net::DatagramSocket datagram(socketAddress); char buffer[1024];
for ( ; ; ){Poco::Net::SocketAddress sender;int n &#61; datagram.receiveFrom(buffer, sizeof(buffer) - 1, sender);buffer[n] &#61; &#39;\0&#39;;std::cout <



  HTTP客户端编写方式&#xff1a;


    .h文件

class LPoco
{public:
/*******************************************************************************///创建一个Tcp连接到服务器Poco::Net::SocketAddress LCtSocketToServer(std::string http,int port);//使用::Net::SocketStream类,它提供了一个I / O流StreamSocket接口Poco::Net::StreamSocket LRwStreamSocket(Poco::Net::SocketAddress socket);//format 流格式 比如xml ->/*str <<"GET / HTTP/1.1\r\n""Host: www.test.com\r\n""\r\n";*///拷贝流数据 使用内部缓冲区将从istr读取的所有字节写入std::ostream ostrvoid LCopyStream(Poco::Net::StreamSocket stream,std::string format,std::ostream & ostr, std::size_t bufferSize &#61; 8192);//拷贝流数据 使用内部缓冲区将从istr读取的所有字节写入string ostrstd::string LCopyString(Poco::Net::StreamSocket stream,std::string format,std::string & ostr, std::size_t bufferSize &#61; 8192);
/********************************************************************************/
};


    .cpp文件

//创建一个Tcp连接到服务器
Poco::Net::SocketAddress LPoco::LCtSocketToServer(std::string http,int port)
{Poco::Net::SocketAddress sa(http, port);return sa;
}//使用::Net::SocketStream类,它提供了一个I / O流StreamSocket接口
Poco::Net::StreamSocket LPoco::LRwStreamSocket(Poco::Net::SocketAddress socket)
{Poco::Net::StreamSocket str(socket);return str;
}//format 流格式 比如xml ->/*str <<"GET / HTTP/1.1\r\n""Host: www.test.com\r\n""\r\n";*///拷贝流数据 使用内部缓冲区将从istr读取的所有字节写入ostr
void LPoco::LCopyStream(Poco::Net::StreamSocket stream,std::string format,std::ostream & ostr, std::size_t bufferSize)
{Poco::Net::SocketStream Socket(stream);Socket <}//拷贝流数据 使用内部缓冲区将从istr读取的所有字节写入string ostr
std::string LPoco::LCopyString(Poco::Net::StreamSocket stream,std::string format,std::string & ostr, std::size_t bufferSize)
{Poco::Net::SocketStream Socket(stream);Socket <}

    方法调用&#xff1a;

LPoco m_poco;Poco::Net::SocketAddress stream &#61; m_poco.LCtSocketToServer("www.test.com", 8080);Poco::Net::StreamSocket socket &#61; m_poco.LRwStreamSocket(stream);std::string ostr;m_poco.LCopyString(socket,"GET / HTTP/1.1\r\n""Host: www.test.com\r\n""\r\n",ostr);std::cout <

    DNS域名解析方式&#xff1a;

const HostEntry& entry &#61; DNS::hostByName("www.appinf.com");
//获取别名
const HostEntry::AliasList& aliases &#61; entry.aliases();
HostEntry::AliasList::const_iterator it &#61; aliases.begin();
int nNum &#61; 0;
for (; it !&#61; aliases.end(); &#43;&#43;it)
{std::cout <<"Alias: " <<*it <<"" <<&#43;&#43;nNum <}
//获取地址
nNum &#61; 0;
const HostEntry::AddressList& addrs &#61; entry.addresses();
HostEntry::AddressList::const_iterator it1 &#61; addrs.begin();
for (; it1 !&#61; addrs.end(); &#43;&#43;it1)
{std::cout <<"Address: " <toString() <<" " <}



PocoFoundation&#xff1a;

  介绍(引自官方)&#xff1a;

    PocoFoundation是POCO的核心。它包含基础平台抽象层以及常用的实用程序类和功能。Foundation库包含用于固定大小整数的类型&#xff0c;用于在字节顺序之间转换整数的函数&#xff0c;Poco :: Any类&#xff08;基于boost :: Any&#xff09;&#xff0c;用于错误处理和调试的实用程序&#xff0c;包括各种异常类和对断言的支持。还提供了许多用于内存管理的类&#xff0c;包括基于引用计数的智能指针&#xff0c;以及用于缓冲区管理和内存池的类。对于字符串处理&#xff0c;POCO包含许多功能&#xff0c;其中包括修剪字符串&#xff0c;执行不区分大小写的比较和大小写转换。还可以通过类的形式获得对Unicode文本的基本支持&#xff0c;这些类可以在不同的字符编码&#xff08;包括UTF-8和UTF-16&#xff09;之间转换文本。那里支持格式化和解析数字&#xff0c;包括sprintf的类型安全变体。还提供了基于众所周知的PCRE库&#xff08;http://www.pcre.org&#xff09;的正则表达式。



    PocoFoundation常用头定义&#xff1a;

      #include “Poco/Logger.h”
      #include “Poco/AutoPtr.h”
      #include “Poco/ConsoleChannel.h”
      #include “Poco/PatternFormatter.h”
      #include “Poco/FormattingChannel.h”
      #include “Poco/SimpleFileChannel.h”
      #include “Poco/LocalDateTime.h”
      #include “Poco/Message.h”



    使用PocoFoundation框架需要包含库名&#xff1a;

      PocoFoundation




  Poco日志(封装后的函数)&#xff1a;


    .h文件

#include "Poco/Logger.h"
#include "Poco/AutoPtr.h"
#include "Poco/ConsoleChannel.h"
#include "Poco/PatternFormatter.h"
#include "Poco/FormattingChannel.h"
#include "Poco/SimpleFileChannel.h"
#include "Poco/LocalDateTime.h"
#include "Poco/Message.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include #define PATH "/works/examples"
#define NAME "poco_log"
#define SUFFIX ".log"//日志是否有效写入&#xff0c;如果为false直接返回
#define LOGVALID truevoid init_logger(const std::string app_name,const std::string app_version,bool use_console_log &#61; true,bool file_log &#61; true,const std::string target &#61; "./log",std::string loglevel &#61; "information",int64_t rotation_size &#61; 10 * 1024 * 1024,bool auto_flush &#61; true);struct LoggerInfo
{std::string app_name;std::string app_version;bool use_console_log;bool file_log;std::string target;std::string loglevel;int64_t rotation_size;bool auto_flush;
};class poco_log
{public:poco_log();//传入日志路径和名称&#xff0c;其中日志路径可以为空poco_log(std::string path,std::string name);poco_log(LoggerInfo log);void fatal(std::string str);void critical(std::string str);void error(std::string str);void warning(std::string str);void debug(std::string str);void trace(std::string str);void information(std::string str);void notice(std::string str);void init(LoggerInfo log);public:Poco::Logger & m_logger &#61; Poco::Logger::root();Poco::AutoPtr m_Channel;Poco::AutoPtr m_patternFormatter;Poco::AutoPtr m_formattingChannel;LoggerInfo m_logInfo;
};static LoggerInfo g_logger;void LOGE(std::string logs,std::string type &#61; "");
void LOGE_Fmt(const char *fmt, ...);
void LOGE_Fmt_Type(std::string type,const char *fmt, ...);
void LOGD(std::string logs,std::string type &#61; "");
void LOGD_Fmt(const char *fmt, ...);
void LOGD_Fmt_Type(std::string type,const char *fmt, ...);
void LOGW(std::string logs,std::string type &#61; "");
void LOGW_Fmt(const char *fmt, ...);
void LOGW_Fmt_Type(std::string type,const char *fmt, ...);
void LOGC(std::string logs,std::string type &#61; "");
void LOGC_Fmt(const char *fmt, ...);
void LOGC_Fmt_Type(std::string type,const char *fmt, ...);
void LOGF(std::string logs,std::string type &#61; "");
void LOGF_Fmt(const char *fmt, ...);
void LOGF_Fmt_Type(std::string type,const char *fmt, ...);
void LOGI(std::string logs,std::string type &#61; "");
void LOGI_Fmt(const char *fmt, ...);
void LOGI_Fmt_Type(std::string type,const char *fmt, ...);
void LOGN(std::string logs,std::string type &#61; "");
void LOGN_Fmt(const char *fmt, ...);
void LOGN_Fmt_Type(std::string type,const char *fmt, ...);
void LOGT(std::string logs,std::string type &#61; "");
void LOGT_Fmt(const char *fmt, ...);
void LOGT_Fmt_Type(std::string type,const char *fmt, ...);
//获取日志对象
poco_log *GetLogObj(std::string type);
//创建日志类型
poco_log *CreateLogObj(std::string type);
//释放所有日志对象
void FreeLogObjs();


    .cpp文件

/**
* 李坤昱
*/
static bool g_bValid &#61; false;
static std::string defaltName;
std::map Llogs;poco_log::poco_log()
{}poco_log::poco_log(LoggerInfo log):m_logInfo(log)
{}void poco_log::init(LoggerInfo log)
{m_logInfo &#61; log;if (log.use_console_log)m_Channel &#61; new Poco::ConsoleChannel;else{m_Channel &#61; new Poco::SimpleFileChannel;char StrFormat[256] &#61; {0};Poco::LocalDateTime local;local.utcTime();sprintf(StrFormat,"%s%s%d%02d%02d%02d%02d%02d%s",log.target.c_str(),log.app_name.c_str(),local.year(),local.month(),local.day(),local.hour(),local.minute(),local.second(),SUFFIX);std::string logname(StrFormat);m_Channel->setProperty("path",logname);memset(StrFormat,0,sizeof(StrFormat));sprintf(StrFormat,"%d M",log.rotation_size / 1024 / 1024);m_Channel->setProperty("rotation", StrFormat);}//m_patternFormatter &#61; new Poco::PatternFormatter("[%Y-%n-%e %H:%M:%S] [%U(%u)] %p: %t");m_patternFormatter &#61; new Poco::PatternFormatter("[%Y-%n-%e %H:%M:%S] [%p]: %t");m_patternFormatter->setProperty("times", "local"); // 格式化中的时间显示为本地时间m_formattingChannel &#61; new Poco::FormattingChannel(m_patternFormatter, m_Channel);m_logger.setLevel(log.loglevel);m_logger.setChannel(m_formattingChannel);g_bValid &#61; true;
}void poco_log::error(std::string str)
{if (!str.empty()){//m_logger.setChannel(m_formattingChannel);m_logger.error(str);}}void poco_log::debug(std::string str)
{if (!str.empty()){//m_logger.setChannel(m_formattingChannel);m_logger.debug(str);}
}void poco_log::fatal(std::string str)
{if (!str.empty()){//m_logger.setChannel(m_formattingChannel);m_logger.fatal(str);}
}void poco_log::warning(std::string str)
{if (!str.empty()){//m_logger.setChannel(m_formattingChannel);m_logger.warning(str); }
}void poco_log::trace(std::string str)
{ if (!str.empty()){//m_logger.setChannel(m_formattingChannel);m_logger.trace(str);}
}void poco_log::critical(std::string str)
{if (!str.empty()){//m_logger.setChannel(m_formattingChannel);m_logger.critical(str);}
}void poco_log::information(std::string str)
{if (!str.empty()){//m_logger.setChannel(m_formattingChannel);m_logger.information(str);}
}void poco_log::notice(std::string str)
{if (!str.empty()){//m_logger.setChannel(m_formattingChannel);m_logger.notice(str);}
}void init_logger(const std::string app_name,const std::string app_version,bool use_console_log,bool file_log,const std::string target,std::string loglevel,int64_t rotation_size,bool auto_flush)
{g_logger &#61; {app_name,app_version,use_console_log,file_log,target,loglevel,rotation_size,auto_flush};defaltName &#61; app_name;
}void LOGE(std::string logs,std::string type)
{if (!LOGVALID)return;std::string logname &#61; (type.empty() ? defaltName : type);poco_log *logObj &#61; GetLogObj(logname);if (0 &#61;&#61; logObj){if (0 &#61;&#61; (logObj &#61; CreateLogObj(logname)))return;elselogObj->error(logs);} elselogObj->error(logs);
}void LOGE_Fmt(const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGE(std::string(printf_buf));
}void LOGE_Fmt_Type(std::string type,const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGE(std::string(printf_buf),type);
}void LOGD(std::string logs,std::string type)
{if (!LOGVALID)return;std::string logname &#61; (type.empty() ? defaltName : type);poco_log *logObj &#61; GetLogObj(logname);if (0 &#61;&#61; logObj) {if (0 &#61;&#61; (logObj &#61; CreateLogObj(logname)))return;elselogObj->debug(logs);}elselogObj->debug(logs);
}void LOGD_Fmt(const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGD(std::string(printf_buf));
}void LOGD_Fmt_Type(std::string type,const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGD(std::string(printf_buf),type);
}void LOGW(std::string logs,std::string type)
{if (!LOGVALID)return;std::string logname &#61; (type.empty() ? defaltName : type);poco_log *logObj &#61; GetLogObj(logname);if (0 &#61;&#61; logObj) {if (0 &#61;&#61; (logObj &#61; CreateLogObj(logname)))return;elselogObj->warning(logs);}elselogObj->warning(logs);
}void LOGW_Fmt(const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGW(std::string(printf_buf));
}void LOGW_Fmt_Type(std::string type,const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGW(std::string(printf_buf),type);
}void LOGC(std::string logs,std::string type)
{if (!LOGVALID)return;std::string logname &#61; (type.empty() ? defaltName : type);poco_log *logObj &#61; GetLogObj(logname);if (0 &#61;&#61; logObj) {if (0 &#61;&#61; (logObj &#61; CreateLogObj(logname)))return;elselogObj->critical(logs);}elselogObj->critical(logs);
}void LOGC_Fmt(const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGC(std::string(printf_buf));
}void LOGC_Fmt_Type(std::string type,const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGC(std::string(printf_buf),type);
}void LOGF(std::string logs,std::string type)
{if (!LOGVALID)return;std::string logname &#61; (type.empty() ? defaltName : type);poco_log *logObj &#61; GetLogObj(logname);if (0 &#61;&#61; logObj) {if (0 &#61;&#61; (logObj &#61; CreateLogObj(logname)))return;elselogObj->fatal(logs);}elselogObj->fatal(logs);
}void LOGF_Fmt(const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGF(std::string(printf_buf));
}void LOGF_Fmt_Type(std::string type,const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGF(std::string(printf_buf),type);
}void LOGI(std::string logs,std::string type)
{if (!LOGVALID)return;std::string logname &#61; (type.empty() ? defaltName : type);poco_log *logObj &#61; GetLogObj(logname);if (0 &#61;&#61; logObj) {if (0 &#61;&#61; (logObj &#61; CreateLogObj(logname)))return;elselogObj->information(logs);}elselogObj->information(logs);
}void LOGI_Fmt(const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGI(std::string(printf_buf));
}void LOGI_Fmt_Type(std::string type,const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGI(std::string(printf_buf),type);
}void LOGN(std::string logs,std::string type)
{if (!LOGVALID)return;std::string logname &#61; (type.empty() ? defaltName : type);poco_log *logObj &#61; GetLogObj(logname);if (0 &#61;&#61; logObj) {if (0 &#61;&#61; (logObj &#61; CreateLogObj(logname)))return;elselogObj->notice(logs);}elselogObj->notice(logs);
}void LOGN_Fmt(const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGN(std::string(printf_buf));
}void LOGN_Fmt_Type(std::string type,const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGN(std::string(printf_buf),type);
}void LOGT(std::string logs,std::string type)
{if (!LOGVALID)return;std::string logname &#61; (type.empty() ? defaltName : type);poco_log *logObj &#61; GetLogObj(logname);if (0 &#61;&#61; logObj) {if (0 &#61;&#61; (logObj &#61; CreateLogObj(logname)))return;elselogObj->trace(logs);}elselogObj->trace(logs);
}void LOGT_Fmt(const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGT(std::string(printf_buf));
}void LOGT_Fmt_Type(std::string type,const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGT(std::string(printf_buf),type);
}//获取日志对象
poco_log *GetLogObj(std::string type)
{auto it &#61; Llogs.find(type); if (Llogs.end() !&#61; it)return it->second;return 0;
}//创建日志类型
poco_log *CreateLogObj(std::string type)
{poco_log *logObj &#61; new poco_log;LoggerInfo logger &#61; g_logger;logger.app_name &#61; type;logObj->init(logger);Llogs[type] &#61; logObj;return logObj;
}//释放所有日志对象
void FreeLogObjs()
{for(auto it &#61; Llogs.begin();it !&#61; Llogs.end();it&#43;&#43;){if (it->second)delete it->second,it->second &#61; 0;}
}



  Poco日志用法&#xff1a;

init_logger("test","1.0.0",1(日志输出到控制台),1(保存日志到文件),"/tmp",0);
LOGI_Fmt("load ini ... :%s \n","test.ini");


  Poco智能指针用法&#xff1a;

Poco::AutoPtr taskalloc &#61; new Taskalloc();
taskalloc->func();



  Poco json相关用法&#xff1a;


    解析json&#xff1a;

//获取json数据Parser parser;Var result &#61; parser.parse(msg);//转换为可以解析key的jsonPoco::JSON::Object::Ptr object &#61; result.extract();Var test &#61; object->get("test");//{"test" : { "property" : "value" } }Poco::JSON::Object::Ptr subObject &#61; test.extract();test &#61; subObject->get("property"); // { "property" : "value" }std::string val &#61; test.toString();


    转换为json格式的数据&#xff1a;

JSON::Object json;json.set("test", "123");std::stringstream out;Poco::JSON::Object::Ptr Object &#61; json.extract();Object->stringify(json,out);std::string str;str &#61; out.str()



  Poco 获取当前时间&#xff1a;

char StrFormat[256] &#61; {0};
Poco::LocalDateTime local;
local.utcTime();
sprintf(StrFormat,"02d%02d%02d%02d%02d",local.year(),local.month(),local.day(),local.hour(),local.minute(),local.second());



  Poco 线程池用法&#xff1a;

class Task : public Poco::Runnable{virtual void run(){}virtual void release(){}};Poco::ThreadPool m_workthrdpool;
//初始化线程数量
m_workthrdpool.addCapacity(8);
//线程池调用
if (0 {Task *task &#61; new Task();m_workthrdpool.start(*task);
}



  Poco 互斥锁用法&#xff1a;

//互斥锁
Poco::Mutex m_mutex;
m_mutex.lock();
m_mutex.unlock();



  Poco 智能锁&#xff1a;

class Lock : public Poco::Runnable
{
public:Lock( Poco::Mutex& mtx ):m_mtx(mtx){}void run( ){//获取锁Poco::Mutex::ScopedLock s( m_mtx);}private:Poco::Mutex& m_mtx;
};



  Poco 智能锁用法&#xff1a;

//互斥锁
Poco::Mutex m_mutex;
void test()
{Lock lock(m_mutex);lock.run();
}



  PocoUtil&#xff1a;



    PocoUtil属于命令行程序及后台程序相关框架&#xff0c;集成功能有&#xff1a;
      命令行参数调用、后台程序启动等&#xff0c;这个框架提供了对于Unix守护进行的支持。



    PocoUtil常用头定义&#xff1a;

      #include “Poco/Util/Application.h”
      #include “Poco/Util/ServerApplication.h”
      #include “Poco/Util/Option.h”
      #include “Poco/Util/OptionSet.h”
      #include “Poco/Util/HelpFormatter.h”
      #include “Poco/Util/IntValidator.h”
      #include “Poco/Util/RegExpValidator.h”
      #include “Poco/Util/Subsystem.h”



    使用PocoUtil框架需要包含库名&#xff1a;

      PocoFoundation
      PocoUtil




  Poco 控制台程序&#xff1a;


    .h文件

using namespace Poco;class LPoco_Cli : public Util::Application
{
public:void initialize( Application& self );void uninitialize( );void defineOptions( Util::OptionSet& options);//void handleHelp(const std::string& name, const std::string& value);//versionvoid handleVersion(const std::string& name, const std::string& value);
}


    .cpp文件

//程序名称
const char *__progname &#61; "test";
void LPoco_Cli::initialize( Application& self )
{Util::Application::initialize( self );
}void LPoco_Cli::uninitialize( )
{Util::Application::uninitialize( );
}void LPoco_Cli::defineOptions( Util::OptionSet& options)
{Util::Application::defineOptions( options );//必须调用m_options &#61; options;options.addOption(Util::Option("help", "h","show the help messages").required(false).repeatable(false).callback(Util::OptionCallback (this, &LPoco_Cli::handleHelp)));options.addOption(Util::Option("version", "v","show version").required(false).repeatable(false).callback(Util::OptionCallback (this, &LPoco_Cli::handleVersion)));
}void LPoco_Cli::handleHelp(const std::string& name, const std::string& value )
{std::cout <<__progname <<" Global command help:" <}void LPoco_Cli::handleVersion(const std::string& name, const std::string& value )
{std::cout <<__progname <<" version :" <}int LPoco_Cli::main(const std::vector& args)
{std::function termination_callback;Poco_Srv *app &#61; new Poco_Srv();termination_callback &#61; std::bind(&Poco_Srv::Run, app);return 0;
}


  Poco 控制台程序启动方式&#xff1a;


    在main函数中&#xff1a;

try{LPoco_Cli app;app.init( argc, argv );//在这里传主函数参数。app.run( );}catch( Poco::Exception &e ){std::cerr <<"error: " <

推荐阅读
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • mybatis 详解(七)一对一、一对多、多对多
    mybatis详解(七)------一 ... [详细]
  • 软件测试行业深度解析:迈向高薪的必经之路
    本文深入探讨了软件测试行业的发展现状及未来趋势,旨在帮助有志于在该领域取得高薪的技术人员明确职业方向和发展路径。 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 解决JavaScript中法语字符排序问题
    在开发一个使用JavaScript、HTML和CSS的Web应用时,遇到从SQLite数据库中提取的法语词汇排序不正确的问题,特别是带重音符号的字母未按预期排序。 ... [详细]
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
  • 如何在U8系统中连接服务器并获取数据
    本文介绍了如何在U8系统中通过不同的方法连接服务器并获取数据,包括使用MySQL客户端连接实例的方法,如非SSL连接和SSL连接,并提供了详细的步骤和注意事项。 ... [详细]
  • 本文详细介绍了Android系统的四层架构,包括应用程序层、应用框架层、库与Android运行时层以及Linux内核层,并提供了如何关闭Android系统的步骤。 ... [详细]
  • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
  • http:blog.csdn.netzeo112140articledetails7675195使用TCPdump工具,抓TCP数据包。将数据包上传到PC,通过Wireshark查 ... [详细]
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • 本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ... [详细]
  • 如何在Django框架中实现对象关系映射(ORM)
    本文介绍了Django框架中对象关系映射(ORM)的实现方式,通过ORM,开发者可以通过定义模型类来间接操作数据库表,从而简化数据库操作流程,提高开发效率。 ... [详细]
  • 浏览器提示网站‘不安全’的原因及解决方法
    在日常上网过程中,我们经常会遇到浏览器提示网站‘不安全’的情况。面对这种情况,不同的人有不同的处理方式,但浏览器为什么会发出这样的警告?本文将详细解析其中的原因,并提供相应的解决方案。 ... [详细]
  • 本文介绍了如何将Spring属性占位符与Jersey的@Path和@ApplicationPath注解结合使用,以便在资源路径中动态解析属性值。 ... [详细]
author-avatar
鐘彦璋864175
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有