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

c++ - 这是使用升压信号的正确和适当的方式吗?

我正在创建一个 MVC 应用程序,并且我希望模型能够将输出文本发送到要显示的 GUI。

一些人推荐了函数指针,但我现在了解到,如果你传递一个成员函数的函数指针,你还必须传递一个指向对象的指针(为什么不只传递对象指针以便可以在其上调用方法呢? )

无论如何,我也被推荐使用 boost::signals2。我已经实现了一个非常简单的工作示例。我基本上将信号绑定到 GUI 对象的函数。然后将指向信号的指针传递给可以触发信号的对象。请参阅下面的代码...

由于我是信号的初学者,我不完全确定我是否按照它们的预期使用它们。

0 投票
2 回答
717 浏览

c++ - 如何传递信号回调(使用 boost::bind)

我正在编写一个包装器boost::signals2::signal以获得更清洁、更易于使用的界面。这是我想出的:

我不确定这是我能想到的最好的包装界面,并且让SomethingHappened成为公共成员可能会有一些缺点。虽然我不介意听听你对此的看法,但这不是这个问题的意义所在。

我想知道如何将回调传递给+=操作员。正如我在ClassThatListensForEvents函数回调中所写的那样,没有问题,但是使用结果bind会产生大量难以阅读的模板编译器错误。

0 投票
0 回答
123 浏览

c++ - 包含 signals2 标头会导致编译错误

我有一个编译得很好的项目,但我想使用信号2添加一些功能。

将 boost/signals2/signal.hpp 包含到我的一门课程中时,我收到以下两个错误:

错误 10 错误 C2338:找到 >= 对齐 d:\boost_1_53_0\boost\type_traits\type_with_alignment.hpp 206 1 TestProject

错误 11 错误 C2338:找到 % Align == 0 d:\boost_1_53_0\boost\type_traits\type_with_alignment.hpp 207 1 TestProject

删除包含,一切都再次编译得很好。有人知道我为什么会收到此编译错误吗?由于错误消息非常有限,我对为什么会发生这种情况一无所知。

我正在使用 MSVC++ 2010

更新:将包含添加到 TestProject.cpp (我的主要功能在哪里,并且类被实例化)以及将其包含在类的头文件中解决了错误。通过从 TestProject.cpp 中删除包含,错误又回来了。

0 投票
2 回答
2049 浏览

c++ - 为什么 enable_shared_from_this 无法直接访问嵌入的weak_ptr?

我想在多线程应用程序中使用带有自动连接管理的 boost signals2。我的类继承自enable_shared_from_this<>,我想从另一个成员方法中连接一个成员方法。连接可能会经常重建,因此我的代码应该尽可能快(尽管提升了信号2性能本身):

我知道我的设计目标可能是冲突的(自动连接管理和线程安全以及快速代码),但无论如何:

  1. 为什么enable_shared_from_this<>缺乏对嵌入式的直接访问weak_ptr<>?我看不到相反的理由。没有和我类似的用例吗?

  2. 有比上述更快的解决方法吗?

编辑:

我知道我可以这样做,但我想避免额外的存储/初始化检查惩罚:

0 投票
1 回答
1468 浏览

c++ - 为什么 boost::signals2::signal::connect 需要复制构造函数吗?

我正在研究一个表示正常数据值的对象,该对象利用函数式反应式编程,当依赖值发生变化时会改变它们的值。我的意思是,假设你有一个 var3 = var1 + var2; 然后当您更改 var1 的值时,var3 的值会自动更新。在 C++ 中,这很困难,但是在某个地方的另一个工作线程中调用了更新函数,你可以让它看起来是功能反应的。

所以这是我这样做的方法。我创建了一个名为 Reactive 的模板对象,其中可以包含任何类型,然后重载它的运算符,这样当这些反应中的两个被加在一起时,不仅结果值等于它们的总和,而且 lambda 是made 将操作存储在 std::function 中,以后可以在任何时候调用它的更新函数时再次调用它来更新结果的值。

出现了几个问题。如果依赖值之一被破坏怎么办。即使生成的 Reactive 仍然具有它认为有效的 lambda,但 lambda 使用的参数不再存在。为了解决这个问题,我求助于 boost::signals2 来建立一个信号和槽系统,以通知结果者他们的任何一个依赖者被破坏。当结果接收到信号时,它的影响函数被清空并且不会在更新时被调用。

为了让 Reactives 能够执行 + 操作,必须创建一个临时的响应式,它具有自己的信号,然后 = 运算符必须重载以将临时中的数据移动到生成的响应式。然而,信号不能被复制。我通过在 std::unique_ptr 中包含 destruct 信号来避开这个问题,当 operator = 收到 Reactive && 时使用 std::move。危机化解了。

现在这是我卡住的地方。后来我意识到,尽管移动构造很好,但仍然无法复制我的 Reactives 之一,因为可以说 var3 = var1 + var2; 然后你这样做: var4 = var3; 然后不知何故 var1 和 var2 中的破坏信号需要一种方法来通知 var4 它们已被破坏。我最终想出的是设置它,以便我有一个名为 Proxy 的子对象,它是一个函子,包含一个 boost::signals2::signal,然后每个对象都会有一个包含在 std::shared_ptr . 如果 Reactive 有对该代理的引用,那么它将它的通知销毁方法连接到该代理。然后依赖者将信号附加到该代理。当代理被调用时,它也会调用它的所有连接。

问题是,将代理连接到依赖信号需要代理具有复制构造函数,或者至少,这是 msvc 给我的错误。显然 boost::signals2::signal::connect 使用它的复制构造函数,它不能因为代理本身包含一个信号。我给你所有这些信息,因为我仍然不确定这是否是最好的解决方案。我选择信号和插槽是因为我对它们最熟悉,但是如果您有更好的解决方案,请指出。否则,请帮助我避免此错误。

顺便说一句,Slot 只是使 Unreact() 函数成为仿函数的一种方式,每个 Reactive 都是唯一的。

这是对象:

和简单的测试

以下是警告/错误:

0 投票
2 回答
1216 浏览

c++ - 如何解决 boost::signals2 的 slot_type 和 boost::bind 的歧义,为什么它甚至是模棱两可的?

考虑这个例子:

当我编译这个时,我得到:

有办法吗?

0 投票
1 回答
1811 浏览

linux - Sigalrm (linux 信号)

我是 Linux 信号的新手。如果一个进程初始化了多个定时器,那么一个进程怎么知道哪个SIGALRM属于哪个定时器呢?

0 投票
2 回答
1266 浏览

c++ - boost::signals2 的包装器,具有通用插槽的生命周期管理

我想为向插槽发出信号的模块(线程)创建 boost::signals2 的包装类。即,一个模块应该通过从我的 Signal 类继承来获得典型的简单信号功能(例如公共 connect(...) 方法)。我还想隐藏使用的实际信号槽实现。

具体插槽继承自通用插槽基类,该基类具有定义其签名的模板参数。插槽只是具有合适签名的函子。

这个问题与这个问题有些相关。插槽存储为 shared_ptr 并且需要生命周期管理。即,只要信号本身退出,Signal 类就应该持有对插槽的引用以使其保持活动状态。因此我无法连接 std::functions 或类似的。我必须连接插槽基类的 shared_ptrs 。

我目前的方法,到目前为止没有线程安全(MSVC 2010):

此代码(版本 A)无法编译。它打破了 boosts slot_template.hpp 和 connectSlot 方法中标记的行:

有趣的是,如果使用版本 B,则此代码将编译并运行 - 即通过插槽传递 boost::ref。虽然有一个编译器警告“带有可能不安全的参数的函数调用 - 此调用依赖于调用者来检查传递的值是否正确。” 在 boost 的 singals2 auto_buffer.hpp 中。

那么这里的实际问题是什么以及如何解决呢?为什么这适用于 boost::ref 以及为什么没有它就无法编译?

我什至不确定整个设计理念是否有用。最初的想法是将整个信令/插槽的东西隐藏在一个超类中,并专注于签名(并包括生命周期管理)。

关于 boost 的信号 2 的另一个问题:singals2 connect() 方法引用了一个插槽。这在内部是如何处理的。它是使用连接插槽的引用还是复制插槽?这很重要,因为我的插槽处理动态分配的内存。

0 投票
1 回答
1213 浏览

c++ - 使用 boost.signals2 如何将动态分配的对象连接到信号

我有一个名为的类Candidate,其中包含一个名为DataUpdate(). 我打算动态创建许多候选实例,并让每个实例将其DataUpdate()作为插槽的功能连接到boost.signals2信号;准备接收信号。

我在下面开发的代码给出了错误:

错误 2 错误 C2276: '&' : 对绑定成员函数表达式的非法操作

我不确定实现预期结果的正确代码。问题似乎在于取消引用指针以获取要传递给candidateInstance的实例函数的地址。有人可以建议正确的方法吗?DataUpdate()signal.connect()

0 投票
1 回答
1194 浏览

c++ - C ++ Boost Signals连接来自模板中两个不同类的两个函数

我正在尝试在一个类中的函数之间建立连接,以便我可以在另一个类中调用它。我找到的答案要么太具体,要么我错过了一些东西,因为我一生都无法弄清楚我做错了什么。另外,我对 boost 库有点陌生,所以请原谅我可能提出的任何愚蠢问题。

我的工作流程的设置基本上是这样的......

基本上, addlistener 函数不会在信号和函数之间建立连接。我知道在我不知道该怎么做的地方我做错了,但我就是不知道它是怎么回事。我把它作为一个辅助函数,这样我就可以将函数从一个类传递到另一个类,然后在它们连接时调用它们。我正在尝试从 websocket 连接创建一个多米诺骨牌事件,但我显然错过了一些非常重要的东西。任何帮助将不胜感激。

我在 xcode 和 boost 和 macbook pro 上。