Boost信号连接管理

boost signals connection management

本文关键字:管理 连接管 连接 信号 Boost      更新时间:2023-10-16

过去两个晚上我一直在绞尽脑汁想弄清楚这个问题,但没有任何积极的结果。在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);


自动连接管理

在我们的项目中,通常将成员变量声明为有作用域的连接。因此,它们的作用域与它们所属的特定对象实例的活动时间相匹配。这是一种方便的方法,可以在对象实例被销毁时自动断开它所连接的任何信号。如果没有作用域连接,你必须在析构函数中手动断开连接。如果你忽略了在实例被销毁时断开连接,你将调用无效的信号处理程序,这将导致程序崩溃。