【发布时间】:2011-11-21 17:05:55
【问题描述】:
在过去的两个晚上,我一直在努力解决这个问题,但没有任何积极的结果。在 boost 信号中,每次我想将一个类的成员函数连接到另一个类的信号时,如果我想稍后断开连接,我必须将结果连接保存在一个变量中。如果稍后,我想将相同的成员函数连接到其他类信号(成员函数仍然与以前的类信号连接),我必须保存这个新连接以便管理它。我的问题是,有什么办法可以避免这种情况?
【问题讨论】:
标签: c++ boost-signals
在过去的两个晚上,我一直在努力解决这个问题,但没有任何积极的结果。在 boost 信号中,每次我想将一个类的成员函数连接到另一个类的信号时,如果我想稍后断开连接,我必须将结果连接保存在一个变量中。如果稍后,我想将相同的成员函数连接到其他类信号(成员函数仍然与以前的类信号连接),我必须保存这个新连接以便管理它。我的问题是,有什么办法可以避免这种情况?
【问题讨论】:
标签: c++ boost-signals
或者,您可以将返回的连接分配给signal::scoped_connection 类型的变量。这是connection 的一种类型,它会在销毁或重新分配时自动断开连接。这有效地将信号槽连接寿命限制在特定范围内。
例如当你重新分配myConnection时,之前的连接会自动断开:
scoped_connection myConnection = someObject.Signal.connect(MyHandler);
myConnection = totallyDifferentObject.Signal.connect(MyHandler);
在我们的项目中,我们通常将成员变量声明为作用域连接。因此它们的范围与所属的特定对象实例的生存时间相匹配。这是一种方便的方法,可以在对象实例被破坏时自动断开连接到的任何信号。如果没有范围连接,您必须在析构函数中手动断开自己的连接。如果您在实例被销毁时忽略断开它们,您最终会调用无效的信号处理程序,这会使您的程序崩溃。
【讨论】:
您不需要保留connection 实例,您应该能够通过将原始可调用对象传递给signal::disconnect 来断开与信号的连接,如Boost.Signals tutorial 中所述。对于成员函数,问题在于您不能直接将它们传递给signal,您可以将它们包装在自定义函数对象中,然后将其作为signal::disconnect 的参数提供,或者您使用Boost.Bind,它本身不会很有用,因为您不能方便地声明它的返回类型。然而,这个问题可以通过使用 Boost.Bind 和 Boost.Function 来解决。
希望我回答了你的问题。
【讨论】: