问题标签 [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 投票
5 回答
4372 浏览

c++ - 强制删除 boost::signals2 中的插槽

我发现 boost::signals2 使用了一种对连接槽的延迟删除,这使得很难将连接用作管理对象生命周期的东西。我正在寻找一种方法来强制在断开连接时直接删除插槽。任何关于如何通过不同地设计我的代码来解决问题的想法也值得赞赏!

这是我的场景:我有一个 Command 类负责异步执行需要时间的操作,看起来像这样(简化):

该类的调用方式如下:

Command 类通过使用 boost::bind 将 shared_ptr 绑定到 ActualWorker 信号来使自己保持活动状态。

当工作人员完成时,将调用 Command 中的处理程序。现在,由于我希望销毁 Command 对象,因此我断开了与信号的连接,如上面的代码所示。问题是实际的槽对象在断开连接时并没有被删除,它只是被标记为无效,然后在以后删除。这反过来似乎取决于再次触发的信号,在我的情况下它没有这样做,导致插槽永不过期。boost::bind 对象因此永远不会超出范围,将 shared_ptr 保存到我的对象中,该对象永远不会被删除。

我可以通过使用 this 指针而不是 shared_ptr 进行绑定来解决此问题,然后使用成员 shared_ptr 保持我的对象处于活动状态,然后我在处理程序函数中释放该成员,但这有点让设计感觉有点过于复杂。有没有办法在断开连接时强制信号2删除插槽?或者我还能做些什么来简化设计?

任何意见表示赞赏!

0 投票
2 回答
5574 浏览

c++ - 信号和线程——好的或坏的设计决策?

我必须编写一个执行高度计算密集型计算的程序。该程序可能会运行几天。计算可以很容易地在不同的线程中分离,而不需要共享数据。我想要通知我当前状态的 GUI 或 Web 服务。

我当前的设计使用 BOOST::signals2 和 BOOST::thread。它编译并且到目前为止按预期工作。如果一个线程完成了一次迭代并且有新数据可用,它会调用一个连接到 GUI 类中的插槽的信号。

我的问题:

  • 这种信号和线程的组合是一个明智的想法吗?我另一个论坛有人建议其他人不要“走这条路”。
  • 附近是否有我没有看到的潜在致命陷阱?
  • 我的期望是否现实,使用我的 GUI 类来提供 Web 界面或 QT、VTK 或任何窗口将是“容易的”?
  • 是否有我忽略的更聪明的替代方案(如其他提升库)?

以下代码编译为

代码如下:

0 投票
0 回答
252 浏览

c++ - boost.signals2 的交互问题?

我试图在 boost::asio::async_read 从 boost::asio::io_service 调用的函数内部调用一个信号。run 函数在一个线程中运行,观察者连接在不同的线程中。

这会导致错误。这是我的程序还是无法从 io_service::run 调用在另一个线程中运行的处理程序?换句话说,处理程序调用的线程间通信是否可以从另一个线程调用信号?提前致谢。

0 投票
4 回答
1363 浏览

c++ - Boost::Signals 的意义何在?

首先,我是一个绝对的编程初学者,所以不要取笑我太多。
我见过的唯一信号是 GUI 工具包,而 GUI 工具包都带有自己的信号。那么,Boost:Signals 甚至可以与这些 GUI 工具包一起使用吗?这是个好主意吗?信号还有哪些其他应用?

0 投票
1 回答
905 浏览

c++ - 编译升压信号2的问题

为什么这个简单的例子不能编译,我该如何解决这个问题?

0 投票
2 回答
765 浏览

c++ - Boost::signals2::signal::connect 的原型是什么

我想封装一个 signals2::signal 对象并公开 connect 和 operator() 函数,但是它们的原型是什么样的?

例子:

那么如何表达 TYPE1 和 TYPE2 的正确类型,我假设它类似于 SIG_T::???

0 投票
2 回答
4769 浏览

c++ - 使用 boost::signals2 处理许多信号/插槽的连接/断开

我已经开始使用 boost::signals2 而不是我的旧信号代码。不过,我在管理多个连接时遇到了问题。这是我的问题:

我有很多 Person 类的实例:

我还有一个人员浏览器,它必须监视所有可用人员的子集以进行更改。由于人们可以从该子集进出,我必须有一种方法来处理连接对象,并且我创建了一个类 (ConnectionList) 来处理它:

这一切都很好,删除 PeopleBrowser 时连接会被删除,并且有一种添加新连接的好方法。

但是,我们需要添加另一个方法 RemovePerson,并且该方法必须删除与该 Person 实例的 NameChange 信号的连接。

这就是我卡住的地方。我想我可以使 ConnectionList 成为一个模板,并使用一个列表来保存一个引用信号和连接的结构,然后添加一个方法来删除该信号的所有连接。

但似乎这是一个很常见的情况(至少在我的世界里,我在这个单一的应用程序中有 20 个需要这个功能的类),所以我认为必须有更好的方法来处理这个问题?

至少,有没有办法从连接对象中获取对连接信号的引用?

也许 libsigc++ 处理这个更好/不同?

0 投票
2 回答
2693 浏览

c++ - 是否需要构建 boost.signals2 库?

我的系统在构建 boost 库时遇到了问题。我知道大多数 boost 库(幸运的是)只是不需要构建的标头(有一些例外)。是否需要构建 boost :: signals2 库?boost.signals2 库是否也依赖于 boost.signals 库?

0 投票
1 回答
1585 浏览

c++ - C++ 升压信号 2

在 c# 中,我们有 event 关键字,它是一种特殊的委托,只能从声明它的类中调用。那么,有没有办法在本机 C++ 中使用 boost::signals2 来做到这一点,如果是这样,从性能的角度来看它是否昂贵?

0 投票
1 回答
1720 浏览

c++ - 有什么方法可以毫无例外地取消增强信号2中的信号传播?

我想boost::signals2用来处理我的 C++ 应用程序中的事件通知。我希望实现与浏览器 DOM 事件具有相似功能的东西,特别是能够停止事件传播的能力,以便当前接收器是最后一个知道信号的接收器,并且不会调用后续接收器。(请参阅http://www.w3.org/TR/DOM-Level-3-Events/#events-event-type-stopImmediatePropagation了解更多关于它是如何在浏览器中工作的)

我有一个App带有信号的假设类,称为thingHappened. 很可能只有一个App实例,其他几个Widget不同类型的类将connect接收thingHappened通知ThingEvent。有时小部件想要消耗(停止) sThingEvent以便不Widget通知其他 s。

起初我想知道我是否可以通过 a 来实现这一点,shared_connection_block但现在我明白这一次只会抑制一个连接。最初我将 a 传递shared_ptr<ThingEvent>给我的信号,但是一旦调用了信号,就无法干预它的传播。如果我传递一个 shared_ptr,我可以让信号接收器检查事件的值并在它已设置时返回,但我不想将该细节推送给我的库的用户。

我找到的解决方案是ThingEvent在堆栈上传递 a 以便为每个接收器复制它。如果我设置mStopPropagation了事件,那么当它被销毁时,我可以抛出异常并且信号调用终止。这样做的缺点是我在调用信号的时候需要我自己的 try/catch,而且从风格上讲,这意味着我将 anexception用于非特殊目的。有没有更好的办法?

这是我假设的App课程,带有一个信号thingHappened

我的ThingEvent类,有一些关于事件的数据(例如类型)和一个mStopPropagation属性,如果在析构函数中设置它会导致抛出异常:

这是一个示例信号使用者 a ,如果类型为Widget,它将调用stopPropagation()a :event"goat"

最后,这是一个使用这些类的快速main()函数:

如果你手头有提升(我使用的是 1.44)并且你想编译它,完整的代码和 Makefile 在https://gist.github.com/1445230