问题标签 [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 回答
1486 浏览

c++ - 升压信号自动断开 lambda 插槽

我正在尝试这样做:

这会导致问题吗?

连接 c 仅在连接后分配。

连接前需要初始化 lambda。

似乎按价值捕获是行不通的。但是,我不能通过引用捕获,因为 c 只是一个局部变量。

如果它不是 lambda,我可以捕获“somesignal”,并调用 somesignal.disconnect(slot)。但在 lambda 的情况下,插槽就是它本身。

0 投票
2 回答
2134 浏览

c++ - boost::signals2 对于简单的应用程序是否过大?

在限制为 的环境中C++03boost::signals2与 一起使用boost::functionboost::bind在组件之间实现简单的消息传递系统。它工作得很好,我对此没有任何问题。

但是,在另一个完全支持的环境中,对于非常简单的应用程序是否过大?C++11boost::signals2

为了澄清,简单地说,我的意思是

  • 单线程
  • 所有信号都有返回类型void

性能是这个应用程序的关键boost::signals2,所以应用程序不需要的所有奇迹可能弊大于利。

现在,只需std::vector<std::function>处理这个问题,然后切换到其他东西,boost::signals2如果它被认为合适的话会非常简单。

0 投票
1 回答
447 浏览

c++ - 如何将可变成员函数绑定到函子?

我正在尝试使用 std::bind 绑定可变参数函数的第一个参数,然后将返回的函子传递给 boost::signals2::signal 的 connect() 函数。只要可变参数函数不是成员函数,该过程就可以正常工作。这就是我希望能够做到的:

当我编译时,我收到一条错误消息,指出“对...的调用不匹配”其中 ... 是绑定调用的填充模板类型。如果我将 call_var_callback() 的定义移到“测试”对象的范围之外,一切正常。但是,在我的真实代码库中,我需要绑定函数成为类的成员,因为它带有状态。

预先感谢您的考虑和帮助。

0 投票
1 回答
4544 浏览

c++ - 从 boost::signals2 安全断开

对于 boost 信号(现在已弃用),我总是用互斥体包装连接管理和信号调用,以保证线程安全。升压信号 2 应该是开箱即用的。但:

根据Boost Signals2 Thread-Safety文档,当插槽在线程 B 上执行时,可以将插槽与线程 A 断开连接。假设我在线程 A 上创建了一个对象 O 并将 O 的成员函数连接到信号 S在工作线程 B 上执行。现在,由于某些原因,O 需要被销毁,因此之前与 S 断开连接。这是一个例子:

执行此代码打印:

正如我们所看到的,我正在访问一个已经被破坏的对象。所以,最后我再次用互斥锁包装了信号。

我错过了什么吗?有没有更简单的方法可以安全地断开与升压信号 2 的连接?

0 投票
1 回答
655 浏览

c++ - 使用简单程序的 boost::signals2 链接器错误

在 Boost.Signals2 的实验中,我尝试编译以下非常幼稚的程序。该程序确实编译了,但我收到了链接器错误(有关错误消息,请参阅此问题的底部)。

为什么会出现错误以及如何解决?

( 2014-09-17 更新:问题仍未解决。程序可以在 Windows XP 上使用 GCC4.9 和 Code::Blocks 或在 Mac OS X Mavericks 上使用 Clang 和 Xcode 5 成功构建,但出于一些神秘的原因,当程序在 Mac OS X 上使用 GCC4.9 和 Eclipse 构建时,链接错误并没有消失。)

我在 SO 上找到了以下相关线程,但似乎没有一个回答我的问题。

  1. 将库链接在一起时的 boost::signals2 未定义引用
  2. 使用仅标头库时增加链接器错误
  3. 是否需要构建 boost.signals2 库?

这是错误消息:

make all

Building file: ../src/hello.cpp

Invoking: GCC C++ Compiler

/usr/local/bin/g++-4.9 -I/usr/include -I/usr/local/include -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -MMD -MP -MF"src/hello.d" -MT"src/hello.d" -o "src/hello.o" "../src/hello.cpp"

Finished building: ../src/hello.cpp

Building target: hello

Invoking: MacOS X C++ Linker

/usr/local/bin/g++-4.9 -L/usr/local/lib -L/usr/lib -o "hello" ./src/hello.o

Undefined symbols for architecture x86_64:

"std::__detail::_List_node_base::_M_hook(std::__detail::_List_node_base*)", referenced from:

void std::list<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (), boost::function<void ()> >, boost::signals2::mutex> >, std::allocator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (), boost::function<void ()> >, boost::signals2::mutex> > > >::_M_insert<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (), boost::function<void ()> >, boost::signals2::mutex> > const&>(std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (), boost::function<void ()> >, boost::signals2::mutex> > >, boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (), boost::function<void ()> >, boost::signals2::mutex> > const&) in hello.o

ld: symbol(s) not found for architecture x86_64

collect2: error: ld returned 1 exit status

make: *** [hello] Error 1

0 投票
2 回答
999 浏览

c++ - 带有升压信号的 C++ 模板类2

我正在尝试将升压信号和插槽与 C++ 模板一起使用。这是示例代码:

当我编译时,我得到(编译)错误说:

  1. typedef 模板是非法的
  2. 语法错误:缺少 ';' 在标识符“Sig_t”之前

在模板中使用升压信号是否有任何限制?仅供参考 - 我没有使用 C++11。

非常感谢任何建议/帮助。

0 投票
1 回答
553 浏览

c++ - 升压::信号2;没有添加信号槽的匹配功能

我有一个项目,我对 boost::signals2 有疑问。举一个简短的例子,我将代码缩短为以下三个类(所有类都被简化):

编译时,我总是得到错误 错误:没有匹配函数调用'Plugin::addEventHandler(boost::_bi::bind_t, boost::_bi::list2, boost::arg<1> > >)'

好的,错误很简单:编译器没有找到具有相同类型和参数数量的函数。我试图通过定义一个具有确切类型的对象来绕过它Plugin::EventHandler(它本身就是一个 typedef to boost::signals2::slot1<void, SignalArgs, boost::function<void(SignalArgs)> >&),但没有成功。

我监督了什么吗?

0 投票
2 回答
444 浏览

c++ - 将指针连接到 boost::signals2

我想知道是否有可能以某种方式将指针连接到 boost::signals2::signal。对于我的问题如下:我希望更改连接到“信号”的对象。例如 :

代码将始终输出:

x 是:3

我希望它输出

x 是:2

现在我觉得我错过了一些东西,要么是一个简单的解决方案,要么是对 boost::signals2 的用途有很好的理解。

0 投票
2 回答
186 浏览

c++ - 继承层次结构中的特定类作为 boost::signal2 回调中的类型

我在这样的 gui 类中使用 boost::signals2::signal :

所有 gui 类都继承自此类,以便可以注册回调。一个Toggle类的例子:

每次我必须强制GuiElement转换为 aSpecificClass以访问特定的类函数时,都在回调函数内部。我想避免这种转换并将回调签名声明为:toggle.getSignal().connect([](lx::Toggle &el) {...

有没有办法用模板来实现这一点,比如typedef boost::signals2::signal<void(T &)> GuiElementSignal用类替换 T ?

0 投票
1 回答
206 浏览

c++ - 重用 boost::bind 调用的返回值的正确方法是什么?

我必须遵循代码:

它的正常用法是调用,

并且可以正常工作。

但是,现在我需要经常“重新启动”这个计时器,这需要大量调用 boost::bind(&some_callback) ——我不想这样做,因为这似乎浪费了 CPU。

我想调用一次 boost::bind,然后重用它在随后调用 create() 函数时返回的任何内容。我不确定这是否可行。我可以想象它会泄漏内存,更糟糕的是,使用释放的内存并崩溃或其他东西。

我认为以上信息应该足以给出一般性答案,但让我添加有关此“创建”功能的确切作用的信息。

调用 create() 的效果是使用 new 创建了一个对象“Signal”,其中 Signal 是:

然后将 mSignal 连接到传递给创建的槽值:

当我必须“重新启动”计时器时(在它到期之前),我首先调用 cancel() 函数,然后再次调用 create()。函数 cancel() 有效地调用了 'delete mCallback' - 因此,除了释放上面的 'new' 调用分配的内存之外,没有做任何其他事情。

因此,我猜想存储 boost::bind 的返回值并有效地重复使用它归结为:

这是否允许,或者对“连接”和删除的调用对“插槽”做一些事情,所以我不能在没有副作用的情况下重复使用它?