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