标签:pen css pos 直接 des api函数 syn 共存 ide
grab设计难点
fn main() {
let future1 = future::ok::<u32, u32>(1)
.map(|x| x + 3)
.map_err(|e| println!("Error: {:?}", e))
.and_then(|x| Ok(x - 3))
.then(|res| {
match res {
Ok(val) => Ok(val + 3),
err => err,
}
});
let joined_future = future::join(future1, future::err::<u32, u32>(2));
let val = block_on(joined_future);
assert_eq!(val, (Ok(4), Err(2)));
}
他好像都有类似的问题,即
gmat和mat一起叫做future,一个GraphApi函数相当于一async函数, 一个graph相当于次block_on操作。
GraphApi | 对应rust future |
---|---|
gmat和mat | future |
GraphApi函数 | async函数 |
graph | 一次block_on操作 |
获取输出的值通过 graph.run(ins, outs) | 获取future的值通过 let value = block_on(xx) |
可以在另外的线程获取输出的值,通过 outs[i].get() Pros:适合多线程,跟已有老的代码共存 Cons:容易出错 |
没有对应的用法 Cons:必须全部异步 Pros:安全无副作用 |
Pros:可以做图优化 | 没有对应的用法 |
我们的难点是我们的graph的输入输出不是那么明显,出了问题要运行时才能检测,因为我们的都是一种mat类型
接口上添加setAsioMode()
功能
class Options
{
public:
typedef boost::function<int (std::vector<SharedFuture<Mat>> const &ins, std::vector<int> const &masks)> WaitFunc;
Options():asioMode_(false)
{
}
template <class T>
Options& setWait(T t){asioMode_ = false; wait = t; return *this;}
Options& setAsioMode(){asioMode_ = true; return *this;}
};
综上分析,需要两到三个线程
想到一个办法,就是设计如下类似的api. 一定程度上简化了代码
class Graph
{
public:
class Node
{
public:
// Get Gmat
// Note no need provide non const version, as gmat should not be modified once created
const GraphApi::GMat &gmat() const { return gmat_; }
boost::optional<GraphApi::SharedFuture<GraphApi::Mat>> &mat() { return mat_; }
// Set Mat
void set(GraphApi::Mat const &m);
};
Node createInput();
void run(std::vector<Node> &outNodes);
private:
std::vector<GraphApi::GMat> gins_;
std::vector<GraphApi::SharedFuture<GraphApi::Mat>> ins_;
};
如何实现defer和async两种策略?
提供用法2
// 创建graph节点
Graph g;
auto roi = g.createInput();
auto image = g.createInput();
auto profile = reconstruct(image, roi);
GGraph gg(g.gins(), gouts);
// 用法1:
// 如果input没有ready,下面的函数就会hang
gg.run(g.ins(), profile);
// 用法2:
// 如果让他不hang,可以参考两步。类似于tbb
// flowgraph或者asio。一步叫try_put,用来放某些输入,一步叫poll(),用来将能够处理的放到queue
// image grab module
// 抓图模块设置图像
image.set(im); // 内部执行-->gg.set(index of image, im)
//抓完图后处理
gg.poll();
// inspection module设置roi
roi.set(roi); gg.poll();
标签:pen css pos 直接 des api函数 syn 共存 ide
原文地址:https://www.cnblogs.com/cutepig/p/12693349.html