热门标签 | 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: " <

推荐阅读
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 阿里首席架构师科普RPC框架
    RPC概念及分类RPC全称为RemoteProcedureCall,翻译过来为“远程过程调用”。目前,主流的平台中都支持各种远程调用技术,以满足分布式系统架构中不同的系统之间的远程 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • C++中的三角函数计算及其应用
    本文介绍了C++中的三角函数的计算方法和应用,包括计算余弦、正弦、正切值以及反三角函数求对应的弧度制角度的示例代码。代码中使用了C++的数学库和命名空间,通过赋值和输出语句实现了三角函数的计算和结果显示。通过学习本文,读者可以了解到C++中三角函数的基本用法和应用场景。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 2015年iOS测试现状
    本文由伯乐在线-nathanw翻译,dopcn校稿。未经许可,禁止转载!英文出处:www.mokacoding.com。欢迎加入翻译小组。几周前,我决定将将我在mokacoding ... [详细]
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社区 版权所有