问题标签 [boost-signals2]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
109 浏览

c++ - 如何使用 std::function 或 Boost 在 C++ 中实现类成员指针?

我想在 C++ 中实现一个面向对象的函数指针(类似于 C# 中的委托)。

我写了一个示例代码,它使用“MagicFunctionPainter”作为最终类的占位符:

std::function 或 Boost::Signals2 支持吗?还有其他支持这种情况的库吗?

先感谢您!

0 投票
2 回答
1980 浏览

multithreading - 如何将信号/数据从工作线程发送到主线程?

我将首先说我第一次深入研究多线程。尽管阅读了很多关于并发和同步的文章,但我并没有很容易地看到满足我所得到要求的解决方案。

使用 C++11 和 Boost,我试图弄清楚如何将数据从工作线程发送到主线程。工作线程在应用程序启动时产生并持续监控无锁队列。对象以不同的时间间隔填充此队列。这部分正在工作。

一旦数据可用,它需要由主线程处理,因为另一个信号将被发送到应用程序的其余部分,而不能在工作线程上。这就是我遇到的麻烦。

如果我必须通过互斥锁或条件变量阻塞主线程,直到工作线程完成,那将如何提高响应能力?我还不如只使用一个线程,这样我就可以访问数据了。我一定在这里遗漏了一些东西。

我已经发布了几个问题,认为 Boost::Asio 是要走的路。有一个如何在线程之间发送信号和数据的示例,但正如响应所示,事情很快变得过于复杂并且无法完美运行:

在不同线程上发布工作时如何将信号连接到 boost::asio::io_service?

Boost::Asio 与 Main/Workers 线程 - 我可以在发布工作之前启动事件循环吗?

与一些同事交谈后,建议使用两个队列——一个输入,一个输出。这将在共享空间中,并且输出队列将由工作线程填充。工作线程一直在运行,但可能需要一个计时器,可能在应用程序级别,这将强制主线程检查输出队列以查看是否有任何待处理的任务。

关于我应该将注意力集中在哪里的任何想法?是否有任何技术或策略可能适用于我正在尝试做的事情?接下来我会看Timers。

谢谢。

编辑:这是用于后处理模拟结果的插件系统的生产代码。我们尽可能首先使用 C++11,然后是 Boost。我们正在使用 Boost 的 lockfree::queue。应用程序在单个线程上执行我们想要的操作,但现在我们正在尝试优化我们发现存在性能问题的地方(在这种情况下,计算是通过另一个库进行的)。主线程有很多职责,包括数据库访问,这就是为什么我想限制工作线程实际做的事情。

更新:我已经成功地使用 std::thread 启动了一个工作线程,该线程检查 Boost lock::free 队列并处理放置它的任务。这是@Pressacco 响应中的第 5 步,我遇到了麻烦。当工作线程完成并通知主线程而不是简单地等待工作线程完成时,是否有任何示例向主线程返回值?

0 投票
2 回答
541 浏览

c++ - 如何从另一个线程中引发的 Boost 信号更新 Qt GUI?

acquisitionStageChangedEvent我有一个普通的 C++ 对象,它在单独的线程中运行数据采集例程,并使用带有以下签名的 Boost 信号通知进程: boost::signal2::signal<void(const std::string &)>. 如何在新线程中开始采集并使用此信息更新 UI 而不会出现跨线程异常?

0 投票
2 回答
611 浏览

c++ - boost::signals2::signal 输出错误?

我是boost库的新手,在练习绑定示例时,我编写了以下代码。但是,似乎“res”被正确计算了,但是正确的结果并没有传输回信号。请帮助,以下代码段中有什么问题。 代码在http://cpp.sh/上编译并运行

输出:

0 投票
1 回答
873 浏览

c++ - 增强信号2 给出不可复制的错误

我目前正在开发一个 C++ 应用程序,我需要创建一个将升压信号发送到另一个类的模块。我使用 Document-View 示例作为我的应用程序的基础(http://www.boost.org/doc/libs/1_55_0/doc/html/signals2/tutorial.html#signals2.tutorial.document-view) ,但我不断收到错误消息:

这让我完全被难住了——错误到底发生在哪里?

构建日志如下:

我的主要功能相当简单——我构建了一个 GUI、一个用于与 GUI 通信的模型(TrialModel)、一个每 500 毫秒计数 +1 的简单逻辑和一个出站逻辑适配器,它可以通过逻辑中的 boost signals2 库访问。

逻辑类定义了一个信号,该信号具有一个参数(整数)和一个用作线程的 operator()。

试用逻辑.h:

和代码本身:

最后,接收信号的适配器——

从我的第一次检查中,我找不到任何我做错的地方,但显然我的代码存在严重错误。我很确定问题也不在 GUI 方面,因为我实际上并没有在那里使用任何增强功能,并且在我尝试将系统绑定在一起之前它运行良好。

有什么建议么?

0 投票
1 回答
60 浏览

c++ - 当 boost 信号 2 与 void() 绑定时出错

当我尝试编译此代码时,出现错误

在构造函数 'Foo::Foo()': 15:40: error: 'bind' 没有在这个范围内声明

让我恼火的是它sig1.connect(...)有效但无效sig2.connect(...)。如果我使用 boost::bind() 代替它也适用于sig2.connect(...)

有人可以解释为什么 bind() 与 slot1 一起工作而不是 slot2 吗?

这里是在线“玩”它的代码:http: //cpp.sh/32ey

0 投票
3 回答
1097 浏览

c++ - 将 c++11 std::function 包装在另一个 std::function 中?

我想将 std::bind() 或 lambda 的结果包装在一个帮助函数中,该函数跟踪对该函数的调用的执行时间。我想要一个通用的解决方案,它可以使用任意数量的参数(和类方法)并且与 c++11 兼容。

我的意图是获取包装函数并将其传递给 boost::signals2::signal ,因此生成的函数对象需要与原始函数的签名相同。

我基本上是在寻找一些Wrapper像这样工作的神奇类或函数:

这将计算打印 42 所需的时间。

谢谢!

0 投票
0 回答
848 浏览

c++ - 升级到 VS2013 中的 boost::signals2 会导致 C4996 警告

来自 VS2013 中的以下编译器警告消息:

CL : 警告 : Boost.Signals 不再维护,现在已弃用。请切换到 Boost.Signals2。要禁用此警告消息,请定义BOOST_SIGNALS_NO_DEPRECATION_WARNING.

我将代码从升级boost::signalsboost::signals2.

现在还有更多的丑陋警告不断出现,这只是它的开始:

我已经看到了这个先前提出的问题以及许多其他问题,其中建议的唯一解决方案是禁用警告;然而,这是一个大锤子方法。正如@heavy-rocker-dude 在上面的帖子中所指出的,这甚至发生在最微不足道的 boost Hello World 示例中(不酷)。

任何人都可以提出一个在不影响警告的情况下实际解决问题的解决方案吗?

0 投票
1 回答
946 浏览

c++ - 使用信号处理程序触发事件时,如何让 boost.msm 正确更改状态?

当使用信号处理程序触发事件时,我的 ( boost.msm) 状态机似乎“回滚”。但是,当我使用直接调用来触发事件时,状态机的行为正确。

我查看了 boost 文档并搜索了网络,但似乎所有示例都使用直接调用来触发事件。我也搜索了 SO,但找不到任何解决此主题的内容。

我正在学习 boost 元状态机库,看看是否可以替换我的开发团队目前使用的现有“本土”状态机库。

为了使其工作,我需要能够从信号处理程序(处理来自 的信号boost.signals2)触发状态机事件。

我创建了一个简单但人为的示例来对其进行测试运行,当我看到在第一个事件被触发后,状态机正确(但暂时)改变了状态(在信号处理程序中)但显然“滚动”时,我感到很困惑返回'后返回主。

当我绕过信号处理程序(通过使用对 process_event 的直接调用)时,一切正常。

无可否认,测试状态机旨在做到这一点:

我想知道如何使用信号处理程序正确触发状态机事件来使这个设计(或类似的东西)工作。使用直接呼叫对我来说不是一种选择,因为我只接收到可以使用的信号。

我在下面包含了测试代码。请注意,main 函数的前半部分练习信号处理程序触发,而 main 函数的后半部分练习直接调用触发(使用 编译g++ main.cpp -omain' or 'clang++ main.cpp -omain):

这是输出:

我通过对输出文件进行后处理添加了行号,以便于参考。

输出的第 01 行显示状态机正确地从初始伪状态转换为 state_a。

输出的第 14 行显示状态机在 on_sa_event 函数内部正确地从 state_a 转换到 state_b。

但是,第 17 行显示状态机在从 main (!) 测试时返回到 state_a

对于信号处理程序测试的剩余转换(第 18-41 行),状态机保持在 state_a 中,导致一些“无转换”错误消息。

对于直接调用练习(输出第 42-65 行),状态机在所有状态中正确转换,并且在触发函数内部和在 main 中(在触发函数调用之后)它的“当前状态”没有区别。

环境:操作系统:“Ubuntu 16.04 LTS”

g++ 版本:(Ubuntu 5.3.1-14ubuntu2)5.3.1 20160413

升压版本:boost_1_60_0

0 投票
1 回答
148 浏览

c++ - 如何防止 signals2::scoped_connection 在 disconnect() 中中止?

我正在使用 boost::signals2 并且有连接管理问题。我将 scoped_connections 存储在稍后修剪的列表中。但是,我发现如果拥有相关信号的对象已被销毁,则 scoped_connection::disconnect() 会中止,因为它的几个字段现在无效。

客户端连接:

Manager 类拥有这些 ClientConnections 的列表,并定期迭代并尝试删除无法从中获取合法 shared_ptr 到客户端的条目。我现在了解到 track() 在对象过期时不会断开连接,就像我想象的那样;它只是阻止信号发射。当客户端超出范围时,scoped_connection 最终会指向一堆坏内存,并且在执行 disconnect() 时会出现预取或数据中止。

我忽略的信号2 API中有什么可以纠正这个问题吗?还是我必须重新考虑我的连接管理?我知道必须从这一端保持与客户端信号的连接似乎很奇怪,但是客户端消耗的流可能超出范围,因此在这种情况下,我需要断开管理器的插槽与客户端的连接。