Управление подключением форсированных сигналов
Последние два вечера я ломал голову, пытаясь понять это без положительных результатов. В сигналах форсирования есть одна вещь: каждый раз, когда я хочу подключить, скажем, функцию-член одного класса к сигналу класса другого, я должен сохранить полученное соединение в переменной, если позднее хочу отключиться. Если позже я захочу подключить ту же функцию-член к какому-либо другому сигналу класса (функция-член все еще связана с сигналом предыдущего класса), я должен сохранить это новое соединение, чтобы управлять им тоже. У меня вопрос, есть ли способ избежать этого?
2 ответа
Вам не нужно держать connection
В некоторых случаях вы должны иметь возможность отключиться от сигнала, передав исходный вызываемый signal::disconnect
, как описано в учебнике Boost.Signals. С функциями-членами проблема скорее в том, что вы не можете передать их напрямую signal
вы либо заключаете их в объекты пользовательских функций, которые затем будут доступны в качестве аргументов signal::disconnect
или вы используете Boost.Bind, что само по себе не очень полезно, поскольку вы не можете удобно объявить его тип возвращаемого значения. Однако эту проблему можно решить, используя Boost.Bind вместе с Boost.Function.
Я надеюсь, что ответил на ваш вопрос.
Scoped Connections
В качестве альтернативы вы можете назначить возвращаемое соединение переменной типа signal:: scoped_connection. Это тип соединения, который автоматически отключается при уничтожении или переназначении. Это эффективно ограничивает время жизни сигнального слота для конкретной области.
Например, когда вы переназначаете myConnection, предыдущее соединение автоматически отключается:
scoped_connection myConnection = someObject.Signal.connect(MyHandler);
myConnection = totallyDifferentObject.Signal.connect(MyHandler);
Автоматическое управление подключением
В нашем проекте мы обычно объявляем переменные-члены как соединения с областью видимости. Таким образом, их область действия соответствует времени жизни конкретного экземпляра объекта, которому принадлежит. Это удобный способ автоматически отключать любые сигналы, к которым подключен экземпляр объекта, когда он разрушается. Без ограниченных соединений вы должны вручную отключиться в деструкторе. Если вы забудете отключить экземпляры, когда они уничтожены, вы в конечном итоге вызовете недопустимые обработчики сигналов, что приведет к сбою ваших программ.