C++ REST SDK中的异步流

2016-12-30  本文已影响0人  长不胖的Garfield

目的

C++ REST SDK中的PPLX提供了基于任务的异步编程方案,基于PPLX又提供了异步流,用来将输入输出转换为异步操作,其内容包括:

以下将了解各种流的目的和使用方法。

异步流基础

了解标准流的都知道,流包含两部分:流缓冲、流接口,在C++ REST SDK中其基础实现对应为:

异步流的命名空间在Concurrency::streams,使用时为concurrency::streams

STL容器异步流

定义在containerstream.h中,对应的流缓冲类型为container_buffer,流定类型为container_stream,同时支持写入和读取。
使用示例如下:

//写入字符串到流
std::string strData("test string to write\n");
concurrency::streams::container_buffer<std::string> outStringBuffer(std::move(strData));
outStream.write(outStringBuffer, outStringBuffer.collection().size()).then([](std::size_t bytesWritten)
{
 //写入后处理
});
 
 
concurrency::streams::container_buffer<std::string> inStringBuffer;
inStream.read_line(inStringBuffer).then([inStringBuffer](std::size_t bytesRead) {
 const auto& strLine =  inStringBuffer.collection();
 //读取到后处理
});

作为输出时,作为入参构造相应的buffer,就可以传递给异步输出流使用;作为输入时,只需要构造出该类型的buffer,接收输入,即可从中取出STL容器及对应的内容。

文件异步流

文件异步流定义在filestream.h中,缓冲类型为file_buffer,流类型为file_stream,使用示例如下:

concurrency::streams::fstream::open_istream(U("filename")).then(
    [](concurrency::streams::istream inStream) {
 //处理输入流
});
 
concurrency::streams::fstream::open_ostream(U("filename")).then(
    [](concurrency::streams::ostream outStream) {
 //处理输出流
});

原始内存异步流

定义在rawptrstream.h中,对应的流缓冲类型为rawptr_buffer,流类型为rawptr_stream,同时支持写入和读取,大小是确定的。使用示例如下:

const std::size_t rawDataSize = 8;
unsigned char * rawData = new unsigned char[rawDataSize];
memcpy(&rawData[0], "raw data", rawDataSize);
concurrency::streams::rawptr_buffer<unsigned char> rawOutBuffer(rawData, rawDataSize, std::ios::in);
outStream.write(rawOutBuffer, rawDataSize).then([rawData](std::size_t bytesWritten) {
 delete[] rawData;
 //写入后处理
});

生产者消费者异步流

定义在producerconsumerstream.h,对应的流缓冲类型为producer_consumer_buffer,使用示例如下:

concurrency::streams::producer_consumer_buffer<uint8_t> oBuffer;
ReadWriteStream(oBuffer.create_istream(), oBuffer.create_ostream());

生产者消费者流缓冲同时支持写入或者读取字节内容,一个生产者消费者流缓冲对可以在不同线程通过缓冲通信。

标准输入输出异步流

在一些场景下,需要对进行标准输入输出流和异步流之间互相对接,标准输入输出异步流就起到这样的作用。
譬如将异步流转换为标准流:

concurrency::streams::stringstreambuf strbuf;
concurrency::streams::basic_ostream<char> ss(strbuf.create_ostream());
std::basic_ostream<char> stream(concurrency::streams::async_ostream<char>(ss).rdbuf());
stream << "hello" << ", there, this is " << 4711;

将标准流转换为异步流:

std::stringstream stream;
stream << "abcdefghijklmnopqrstuvwxyz"; 
concurrency::streams::stdio_istream<char> astream(stream); concurrency::streams::container_buffer<std::string> buffer; astream.read_line(buffer).wait();

总结

C++ REST SDK提供了这几种异步流来进行数据流操作,异步化了HTTP等通信时的流操作;即使不是用于云通信,也可以使用来异步化应用程序相关操作。

上一篇 下一篇

猜你喜欢

热点阅读