问题标签 [boost-signals]
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++ - 用户类中的多签名信号管理
我对 Qt 非常熟悉,而且我知道我们不能有类似的合成器,因为我们这里没有 MOC 部分。但是,我试图在我的类中进行信号创建管理以简化信号的声明及其与信号的连接。
这就是我现在正在做的示意图
这基本上是我想做的(大写=缺失部分)
我想我可以用 boost::functions_traits<> 解决“SIGNAL_ARGS”部分,但我不知道如何绕过抽象信号类型。
1/我想要的有可能吗?
2/这是一个好方法吗?(我知道由于 unordered_map.find 会产生一些开销,尤其是当我使用 this->call("signalname", ...) 时,但我认为它不应该太重要)
3/如果这不可能或不是一个好方法,你还有其他建议吗?
c++ - 当通知程序/信号超出范围时,在提升绑定中解除分配回调侦听器对象
我处于将指针保存在向量中的情况,以便我可以使用它们来释放 dtor 中的内存。
我有一个对象监听来自 boost 信号的回调(槽)。这些对象的范围需要大于创建它的方法,因为它应该监听比创建位置晚得多的 boost 信号。所以,我必须在堆中分配内存并立即使用该实例订阅增强信号。
现在,当持有信号的类被销毁时,应该从内存中释放这些对象。现在我的选择是什么,
当 boost 信号超出范围并且所有监听 boost:bind 对象被销毁时,boost 是否会释放所有这些对象?
共享指针或智能指针会帮助我吗?
我是否必须在信令服务中有一个包含所有这些指针的向量才能在其析构函数中释放?有更好的方法吗?
};
c++ - 如何从封装发出它的对象的对象中捕获 C++ boost::signal?
我有一个封装 TCP 连接的TcpDevice类,它有一个onRemoteDisconnect方法,只要远程端挂断,就会调用该方法。然后,有一个SessionManager对象创建TcpSession对象,该对象将 TcpDevice作为通信通道并将它们插入到内部指针容器中以供应用程序使用。如果任何托管的TcpSessions应该结束,我希望SessionManager实例得到通知,然后从容器中删除相应的会话,释放与其关联的资源。
我发现我的问题与这个问题非常相似:
但由于他有一个用于检查连接状态的线程,它与我的有点不同,而且我打算使用boost::signals解决它的方式,所以我决定针对它提出一个新问题 - 如果它是我道歉错误的方法......我仍然对如何正确使用 SO 有感觉 :)
由于我对 QT 信号/插槽有点熟悉,我发现boost::signals提供了类似的机制(我已经在使用boost::asio并且在这个项目中没有 QT),所以我决定实现一个remoteDeviceDisconnected信号由TcpDevice 的 onRemoteDisconnect发出,为此我将在SessionManager中有一个插槽,然后从容器中删除断开连接的会话和设备。
为了最初尝试,我在tcpdevice.hpp 中将信号声明为TcpDevice的公共成员:
然后我从TcpDevice 的 onRemoteDisconnect方法发出它,如下所示:
现在,有没有办法从会话管理器内部将此信号连接到我的SessionManager插槽?我试过这个:
它编译得很好,但在链接时它抱怨多个目标代码文件中的remoteDeviceDisconnected的多个定义:
我觉得这很奇怪,因为我没有在任何地方重新定义信号,只是在上面的createSession方法中使用它。
任何提示将非常感谢!谢谢!
c++ - 使用boost模块而不使用boost的其余部分?
我想在我正在开发的一个小型教育框架中包含提升信号,但我不想添加所有内容,因为提升很大,我需要的是线程、信号 1&2 和 asio。
我的问题是关于由于没有完整的 boost 库而可能导致的任何依赖关系或许可问题?
c++ - 错误:“无法访问在类 'boost::signals2::scoped_connection' 中声明的私有成员”?
// .cpp
(注意AddEventOccurredObserver
只是委托boost::signals2::connect()
并返回boost::signals2::connection
)
我收到以下错误。很难解释模板错误,但似乎错误是在成员声明中引起的std::vector<boost::signals2::scoped_connection> boostSignalConnections_;
我已经搜索过,我认为这可能与 scoped_connection 不可复制有关?我不知道。我使用 scoped_connection 的原因是因为这个 SO 问题: Handle connection/disconnection of many signals/slots with boost::signals2
更新
仅供参考,当我从 更改scoped_connection
为connection
时:std::vector<boost::signals2::connection> boostSignalConnections_;
。我使用的全部原因scoped_connection
是它们会在破坏时自动断开连接,而我相信 aconnection
不会。但是,我可以遍历集合并手动断开每个集合。
c++ - 是否有一些用于模拟 Glib::Dispatcher 的 Boost 功能?
我目前正在重构一个中型软件项目。它包含一个由多个线程使用的中央内核类。目前,此类使用 aGlib::Dispatcher
来处理由多个线程发出的信号。由于重构过程的一个目标是完全摆脱glibmm
(因为Qt
将用作新框架),我试图找出一种如何使用Boost
. 我已经研究过Boost.Signals
and Boost.Signals2
,但是这些库似乎都没有提供调度程序的替代方案。
为了阐明调度员应该做什么,这里有一个来自官方文档的简短描述:
Glib::Dispatcher 的工作方式类似于 sigc::signal。但与普通信号不同的是,通知是通过管道异步发生的。这是在线程之间进行通信的一种简单而有效的方式,在具有单个 GUI 线程的线程模型中特别有用。
除了操作系统的内部 I/O 锁定之外,不涉及互斥锁。这意味着一些使用规则:
- 只有一个线程可以连接到信号并接收通知,但即使没有锁定也允许多个发送者。
- GLib 主循环必须在接收线程中运行(这通常是 GUI 线程)。
- Dispatcher 对象必须由接收线程实例化。
- 如果您想避免额外的锁定,则应在创建任何发送者线程之前实例化 Dispatcher 对象。
- Dispatcher 对象必须由接收线程删除。
- 由同一接收线程实例化的所有 Dispatcher 对象必须使用相同的主上下文。
你能给我一些正确方向的指示吗?Boost.Signals
这是我可以使用或实现的功能Boost.Signals2
吗?
编辑:正如评论者正确指出的那样,使用Qt
可能是一种选择。但是,我正在重构的类是非常低级的,我不想添加这个额外的依赖项。
visual-c++ - 类'boost ::shared_ptr' 需要有 dll 接口供类 'boost::signals::connection' 的客户端使用
我在编译代码时收到以下错误。
代码中的信号定义为
连接完成为
编译成功,但如何摆脱这些编译器警告?
c++ - 有没有办法将升压信号直接连接到另一个信号?
我想知道是否有更好的方法将一个类的 Boost 信号直接连接到另一个类的信号?
例如,想象一个外观类,其中包含一组提供自己的信号的成员。现在假设门面想要暴露这些信号。我通常最终编写样板方法,然后将其连接为信号处理程序。
现在这不是很优雅,一段时间后变得很乏味。有没有办法做到这一点而不必编写这些转发方法?
c++ - 在 boost::signals 中,“slot_type”和“slot_function_type”有什么区别?
在 boost::signals 库本教程的最后,在“传递槽”标题下,使用了一个名为“slot_type”的类型来传递所需的槽函数以连接到信号。但是,在下一个示例中,他们使用名为“slot_function_type”的类型显然做了同样的事情。
我一直无法弄清楚这两件事之间有什么区别。
什么时候应该使用“slot_type”,什么时候应该使用“slot_function_type”?
c++ - 升压的替代品:信号
可能重复:
我应该选择哪个 C++ 信号/插槽库?
我一直在使用升压信号/信号 2 来允许事件连接/函数调度。
它工作正常,但我有两个问题。
- 这是较小的一个,但处理断开连接可能会很痛苦。我使用可跟踪类来帮助解决这个问题,但它并不能解决所有问题。如果我想在任意时间断开信号,必须跟踪连接也有点麻烦
- 这是更大的一个。没有办法复制信号,这意味着我每次向类添加信号时都需要实现一个复制构造函数,如果我确实复制了该类,它将不再有任何事件挂钩。显而易见的解决方案是让持有的 Signal 成为一个指针,然后它是可复制和可共享的,但这感觉很脏而且形式不好。
鉴于上述情况,我开始寻找替代方案,但上述问题对于信号库来说似乎很常见。我想知道是否有人有解决上述问题的建议;也许是一种直接处理它们的方法。
在开始使用升压信号之前,我也在考虑回到我原来的解决方案。像这样的东西:
boost::function 将代替 slot/callbacks,然后我向持有这个 map 的类添加一个 Dispatch 函数,该函数将循环遍历并调用每个 boost::function。使用这种方法,我可以随时轻松删除回调,并且可以复制地图。有人告诉我这不是一个好方法,但现在看,我真的看不出这里有问题。
此外,现在有了可变参数模板,围绕该地图创建一个小类来处理对地图的 Dispatch/Add/Remove 回调调用应该是一件容易的事。
这是一个不好的方法吗?