- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我目前正在测试 tbb 的流程图功能。为了使用它,我必须能够中止图中某些节点的执行,包括所有依赖它的子节点,但让其他不依赖它的子节点继续执行。从主体抛出异常或调用 task::cancel_group_execution() 中止所有节点的执行。
#include <cstdio>
#include "tbb/flow_graph.h"
using namespace tbb::flow;
struct body
{ std::string my_name;
body( const char *name ) : my_name(name)
{
}
void operator()( continue_msg ) const
{ if (my_name == "B")
tbb::task::self().group()->cancel_group_execution();
else
{ sleep(1);
printf("%s\n", my_name.c_str());
}
}
};
int main()
{
graph g;
broadcast_node< continue_msg > start(g);
continue_node<continue_msg> a( g, body("A"));
continue_node<continue_msg> b( g, body("B"));
continue_node<continue_msg> c( g, body("C"));
continue_node<continue_msg> d( g, body("D"));
continue_node<continue_msg> e( g, body("E"));
make_edge( start, a );
make_edge( start, b );
make_edge( a, c );
make_edge( b, c );
make_edge( c, d );
make_edge( a, e );
for (int i = 0; i < 3; ++i )
try
{ start.try_put( continue_msg() );
g.wait_for_all();
} catch (...)
{ printf("Caught exception\n");
}
return 0;
}
最佳答案
如果你希望能够取消部分图的执行,你需要使用task_group_contexts。添加以下内容:
#include "tbb/task.h"
并将您的主程序更改为以下内容:
int main()
{
tbb::task_group_context tgc1;
tbb::task_group_context tgc2;
graph g1(tgc1);
graph g2(tgc2);
printf("Constructing graph\n");
broadcast_node< continue_msg > start(g1);
continue_node<continue_msg> a( g1, body("A"));
continue_node<continue_msg> b( g2, body("B"));
continue_node<continue_msg> c( g2, body("C"));
continue_node<continue_msg> d( g2, body("D"));
continue_node<continue_msg> e( g1, body("E"));
make_edge( start, a );
make_edge( start, b );
make_edge( a, c );
make_edge( b, c );
make_edge( c, d );
make_edge( a, e );
for (int i = 0; i < 3; ++i ) {
try
{
printf("broadcasting graph %d\n", i);
start.try_put( continue_msg() );
g1.wait_for_all();
g2.wait_for_all();
} catch (...)
{ printf("Caught exception\n");
}
g1.wait_for_all();
g1.reset();
g2.reset();
}
return 0;
}
每个 task_group_context 都是(默认)父上下文的子上下文。取消 g2 不会影响 g1。如果 B 抛出而不是取消,您的 catch 将确保异常不会传递给父级。如果不捕获异常,父上下文也将被取消,A 和 E 的上下文也是如此。
请注意,您必须等待两个图表完成。此外,您必须 reset()
图表以重置 continue_nodes
计数器。实际上,在抛出并捕获异常的情况下,并不能保证catch(...)
完成后g1就完成了,所以需要做一个g1。 wait_for_all()
在 try/catch
之外。我编辑了代码以显示这一点。
不是使用取消来停止部分计算,您可以使 B 成为一个 multifunction_node
,输入为 continue_msg
,输出为 continue_msg
:
typedef multifunction_node<continue_msg, tuple<continue_msg> > mf_type;
struct mf_body {
std::string my_name;
mf_body(const char *name) : my_name(name) {}
void operator()(continue_msg, mf_type::output_ports_type &op) {
if(my_name == "B") {
printf("%s returning without sending\n", my_name.c_str());
return;
}
sleep(1);
get<0>(op).try_put(continue_msg());
return;
}
};
然后你创建节点B:
mf_type b( g, unlimited, mf_body("B"));
从 B 到 C 的边会像这样设置:
make_edge( output_port<0>(b), c );
在这种情况下,您不需要将图拆分为两个子图。如果节点 B 会取消,它会返回而不会将 continue_msg
转发给它的后继者。如果节点 B 不转发消息,节点 C 将不会执行,因为它需要两个 continue_msgs
才能启动。之后您仍然需要重置图表,以重置 C 的计数。
multifunction_node
的优点是您可以选择是否转发消息。这里需要注意的是,带有 continue_msg
输入的 multifunction_node
与 continue_node
不同。 continue_node
需要与其前任一样多的 continue_msgs
(加上构造时的初始化值)。multifunction_node
主体在收到 时执行code>continue_msg
,不管它有多少前驱。因此,对于您的图表,您不能只将所有节点设为 multifunction_nodes
。
关于c++ - 如何在 tbb 流程图中中止节点及其子节点的执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21148141/
我正在为算法制作流程图,并且遇到了 else if 语句的一些问题。 对于像这样的 if 语句 if (something) {} else if (something) {} else {} els
我为 jQuery Flot 图表编写了一个插件,它允许您通过单击图表的线条来动态添加数据点,通过右键单击删除它们,还允许在 Canvas 上拖动这些点。 这工作正常,当您将鼠标悬停在某个点上或拖动一
我设计了一个flowchart概括地描述编程过程的工作原理。此过程的一部分涉及循环访问一组项目。我想知道是否有任何标准或半标准的方法来表示流程图中的“foreach”样式循环,这不涉及使用像 m =
这是关于生产以下产品的 EPR/库存管理的一般问题: 1) 组装2)拆卸 通常在组装时,我们生产的成品将作为库存进入库存。示例: 成品不错: 1x Desktop CPU 原 Material : 1
我有一个关于不喜欢/喜欢的折线图。正值应具有较深的绿色边框,红色值应具有较深的红色边框。此外,红点应该用红色填充,而不是绿色。 这就是它的样子! 这就是它应该的样子 几个小时后我无法得到任何解决方案,
我的对象大致如下所示: public class Object1 { public string connectionIn1 { get; set; } public string con
我正在使用 Flowchart来自 http://gojs.net/latest/samples/flowchart.html它工作正常。唯一的问题是,它没有 t display the toolba
我已经在互联网上搜索了几天使用 html 和 css 制作流程图(饼图和垂直图)的方法,但我没有找到任何东西。有人用 html 和 css 制作这些类型的图表并且可以提供帮助吗我? 最后我找到了一种方
我有一个图表,在 Y 轴上显示 0-100%,在 X 轴上显示四分之一。源数据包括: { date: '2015 Q1', numerator: 55, denominator: 105, p
Oracle sql执行流程图_SQL执行过程 1、sql语句的执行步骤: 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义。 2) 语义分析,检查语句中涉及的所有数据库对象是否
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我正在尝试使用流程图在 xaxis 上显示时间 这是我的数据数组(时间、值) var time = [["13:33","0.04668"],["13:23","0.04856"],["13:12",
有人可以指点我一些教程或提供有关如何在 Dart 中创建图表/流程图的示例代码片段吗?简单的情况是有几个元素可以相互连接,并且可以读取哪个元素连接到哪里。有大量 JS 示例,但出于学习目的,我想采用
我是 D3.js 的新手。请注意,正在使用版本 4。 .HTML文件 (很多来自 here ): .node circle { fill: #fff; stroke: steelblue
我已经使用英特尔出色的 TBB 流程图库成功制作了一个应用程序原型(prototype)。它似乎工作得很好,但现在我需要将代码重构为生产就绪版本。 以前,我曾为这个特定领域使用过一些更大、更“过度开发
目前我正在尝试制作流程图,这是我目前得到的代码: #flowchart { width: 580px; text-align: center; fon
我需要编写一个 C++ GUI,这样用户就可以制作一个流程图/管道,方法是从工具栏中选择几个 block 并将它们放入一个窗口中,然后按照他想要的顺序连接它们,然后程序运行流程图。 (为简单起见,只考
我需要一个非常简单、直接的 CSS/HTML 流程图,格式如下: Node1 | Node2 | Node3 | Node4 | Node5 | Node6 我对 CSS 几乎一无
如果可能,还可以在 excel 应用程序中运行所有模块。 最佳答案 流程图会很有用。我从未见过类似的代码,但有一些 VBA 工具,您可能会觉得有趣。这些是我知道的:http://www.vitosha
我是 GNUradio 的新手,我正在制作一个 FM 接收器。我正在将数据记录到文件接收器中。但是我只需要1毫秒的数据。我如何指定这个时间,以便我的流程图在这个时间之后自动停止? 我还阅读了一些关于调
我是一名优秀的程序员,十分优秀!