Boost信号连接管理
boost signals connection management
过去两个晚上我一直在绞尽脑汁想弄清楚这个问题,但没有任何积极的结果。在boost信号中,每次我想连接,比如说,一个类的成员函数到另一个类的信号时,如果我想稍后断开连接,我必须将结果连接保存在变量中。如果以后,我想将相同的成员函数连接到其他一些类信号(成员函数仍然与以前的类信号连接),我必须保存这个新的连接,以便管理它。我的问题是,有没有办法避免这种情况?
您不需要保留connection
实例,您应该能够通过将原始可调用对象传递给signal::disconnect
来断开与信号的连接,如Boost中所述。信号教程。对于成员函数,问题在于您不能直接将它们传递给signal
,您要么将它们包装在自定义函数对象中,然后将其作为signal::disconnect
的参数可用,要么使用Boost。Bind,它本身并不是很有用,因为您不能方便地声明它的返回类型。然而,这个问题可以使用Boost来解决。与Boost.Function结合使用
我希望我回答了你的问题。
作用域连接
也可以将返回的连接赋值给signal::scoped_connection类型的变量。这是一种在销毁或重赋时自动断开的连接类型。这有效地将信号槽连接生命周期限制在特定范围内。
例如,当您重新分配myConnection时,前一个连接将自动断开:
scoped_connection myConnection = someObject.Signal.connect(MyHandler);
myConnection = totallyDifferentObject.Signal.connect(MyHandler);
自动连接管理
在我们的项目中,通常将成员变量声明为有作用域的连接。因此,它们的作用域与它们所属的特定对象实例的活动时间相匹配。这是一种方便的方法,可以在对象实例被销毁时自动断开它所连接的任何信号。如果没有作用域连接,你必须在析构函数中手动断开连接。如果你忽略了在实例被销毁时断开连接,你将调用无效的信号处理程序,这将导致程序崩溃。相关文章:
- 当vector是tje全局变量时,c++中vector的内存管理
- 如何维护资源管理器项目视图中当前可见的项目列表
- 有没有办法知道Tracer是否成功地完全连接到了jaegerclientcpp中的jaeger后端服务器
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 资源管理设计模式
- 使用"Task"函数指针队列定义作业管理器
- 实现动态插件管理器
- Alt+Enter 在 Win32 应用中,管理大小调整和分辨率
- libcurl 和 DNS ttl 中的内部连接管理
- 当分配一个字符串值并稍后通过分配另一个值进行更改时C++如何管理内存?
- 在C++管理一家中国.txt
- 在装有 CLion 的 Mac 上使用 C++ 连接到 MySQL 数据库时出现问题
- 编译器资源管理器和 GCC 具有不同的输出
- Mongocxx无法使用SSL连接到mongoDB
- 我们可以通过 IPC 传递具有动态管理成员的类对象吗?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- Q没有管理权限的 exe 无法启动维护工具
- 使用 Outlook 2016 Microsoft Store 连接到 Outlook COM
- MPI 应用程序无法连接到 SMPD 管理器 (空):55846 错误 1722
- 如何在连接到PC的gsm调制解调器中管理收到的短信?