问题标签 [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.
c++ - 升压信号自动断开 lambda 插槽
我正在尝试这样做:
这会导致问题吗?
连接 c 仅在连接后分配。
连接前需要初始化 lambda。
似乎按价值捕获是行不通的。但是,我不能通过引用捕获,因为 c 只是一个局部变量。
如果它不是 lambda,我可以捕获“somesignal”,并调用 somesignal.disconnect(slot)。但在 lambda 的情况下,插槽就是它本身。
c++ - boost::signals2 对于简单的应用程序是否过大?
在限制为 的环境中C++03
,boost::signals2
与 一起使用boost::function
并boost::bind
在组件之间实现简单的消息传递系统。它工作得很好,我对此没有任何问题。
但是,在另一个完全支持的环境中,对于非常简单的应用程序是否过大?C++11
boost::signals2
为了澄清,简单地说,我的意思是:
- 单线程
- 所有信号都有返回类型
void
性能是这个应用程序的关键boost::signals2
,所以应用程序不需要的所有奇迹可能弊大于利。
现在,只需std::vector<std::function>
处理这个问题,然后切换到其他东西,boost::signals2
如果它被认为合适的话会非常简单。
c++ - 如何将可变成员函数绑定到函子?
我正在尝试使用 std::bind 绑定可变参数函数的第一个参数,然后将返回的函子传递给 boost::signals2::signal 的 connect() 函数。只要可变参数函数不是成员函数,该过程就可以正常工作。这就是我希望能够做到的:
当我编译时,我收到一条错误消息,指出“对...的调用不匹配”其中 ... 是绑定调用的填充模板类型。如果我将 call_var_callback() 的定义移到“测试”对象的范围之外,一切正常。但是,在我的真实代码库中,我需要绑定函数成为类的成员,因为它带有状态。
预先感谢您的考虑和帮助。
c++ - 从 boost::signals2 安全断开
对于 boost 信号(现在已弃用),我总是用互斥体包装连接管理和信号调用,以保证线程安全。升压信号 2 应该是开箱即用的。但:
根据Boost Signals2 Thread-Safety文档,当插槽在线程 B 上执行时,可以将插槽与线程 A 断开连接。假设我在线程 A 上创建了一个对象 O 并将 O 的成员函数连接到信号 S在工作线程 B 上执行。现在,由于某些原因,O 需要被销毁,因此之前与 S 断开连接。这是一个例子:
执行此代码打印:
正如我们所看到的,我正在访问一个已经被破坏的对象。所以,最后我再次用互斥锁包装了信号。
我错过了什么吗?有没有更简单的方法可以安全地断开与升压信号 2 的连接?
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 上找到了以下相关线程,但似乎没有一个回答我的问题。
这是错误消息:
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
c++ - 带有升压信号的 C++ 模板类2
我正在尝试将升压信号和插槽与 C++ 模板一起使用。这是示例代码:
当我编译时,我得到(编译)错误说:
- typedef 模板是非法的
- 语法错误:缺少 ';' 在标识符“Sig_t”之前
在模板中使用升压信号是否有任何限制?仅供参考 - 我没有使用 C++11。
非常感谢任何建议/帮助。
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)> >&
),但没有成功。
我监督了什么吗?
c++ - 将指针连接到 boost::signals2
我想知道是否有可能以某种方式将指针连接到 boost::signals2::signal。对于我的问题如下:我希望更改连接到“信号”的对象。例如 :
代码将始终输出:
x 是:3
我希望它输出
x 是:2
现在我觉得我错过了一些东西,要么是一个简单的解决方案,要么是对 boost::signals2 的用途有很好的理解。
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 ?
c++ - 重用 boost::bind 调用的返回值的正确方法是什么?
我必须遵循代码:
它的正常用法是调用,
并且可以正常工作。
但是,现在我需要经常“重新启动”这个计时器,这需要大量调用 boost::bind(&some_callback) ——我不想这样做,因为这似乎浪费了 CPU。
我想调用一次 boost::bind,然后重用它在随后调用 create() 函数时返回的任何内容。我不确定这是否可行。我可以想象它会泄漏内存,更糟糕的是,使用释放的内存并崩溃或其他东西。
我认为以上信息应该足以给出一般性答案,但让我添加有关此“创建”功能的确切作用的信息。
调用 create() 的效果是使用 new 创建了一个对象“Signal”,其中 Signal 是:
然后将 mSignal 连接到传递给创建的槽值:
当我必须“重新启动”计时器时(在它到期之前),我首先调用 cancel() 函数,然后再次调用 create()。函数 cancel() 有效地调用了 'delete mCallback' - 因此,除了释放上面的 'new' 调用分配的内存之外,没有做任何其他事情。
因此,我猜想存储 boost::bind 的返回值并有效地重复使用它归结为:
这是否允许,或者对“连接”和删除的调用对“插槽”做一些事情,所以我不能在没有副作用的情况下重复使用它?