文章目录
concurrency::task应用
#include<iostream>
#include <pplwin.h> //头文件包含
#include <ppltasks.h>
typedef std::vector<std::shared_ptr<osg::Node>> sharedNodeVec;
void function(int a, int b)
{
//首先需要声明一个变量,比较长,多次声明的话可以typedef一下。
//std::vector<std::shared_ptr<osg::Node>>是task执行结果的类型。
//当然,这里是一个vector,里面存放的是osg::Node的指针类型
concurrency::task_completion_event<std::vector<std::shared_ptr<osg::Node>>> result;
//result是Find函数的一个入参
std::shared_ptr<Command> command = new Find(result);
//注意!!! function函数用task的原因就是因为executeCommand这个方法执行command是在另外的线程中进行
//所以result这个入参有了值之后再使用。
m_render->executeCommand(command);
// 1. 接下来使用一下这个result,create_task是当result有结果之后再调用.then方法。
// 2. 这里顺带巩固一下这个lambda函数,‘[]’里面的a或者下面的b都是声明函数的时候给赋的值。
//(上面的话再说明白一些。不论是lambda函数还是普通函数,肯定是有声明有实现。)
//所以a和b都是声明的时候给的值,但是调用这个lamaba函数是当‘()’有值的时候(也就是task的result有结果后.then方法被调用之后lambda函数被调用)
// 3. 这里需要记住的是,这个sharedNodeVec类型就是上面的result变量有值之后的值类型
concurrency::create_task(result).then([a](const sharedNodeVec& resVec){
boost::uuids::random_generator gen; //boost库的随机数生成器,gen()调用结果的类型是个uuid类型
for(const auto res : resVec)
{
const auto id = res ? boost::uuids::to_wstring(gen()) : "";
const auto name = res ? res->getName() : "";
}
}).then([b](concurrency::task<void> error){
//处理错误
});
}