Управление подключением форсированных сигналов

Последние два вечера я ломал голову, пытаясь понять это без положительных результатов. В сигналах форсирования есть одна вещь: каждый раз, когда я хочу подключить, скажем, функцию-член одного класса к сигналу класса другого, я должен сохранить полученное соединение в переменной, если позднее хочу отключиться. Если позже я захочу подключить ту же функцию-член к какому-либо другому сигналу класса (функция-член все еще связана с сигналом предыдущего класса), я должен сохранить это новое соединение, чтобы управлять им тоже. У меня вопрос, есть ли способ избежать этого?

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);


Автоматическое управление подключением

В нашем проекте мы обычно объявляем переменные-члены как соединения с областью видимости. Таким образом, их область действия соответствует времени жизни конкретного экземпляра объекта, которому принадлежит. Это удобный способ автоматически отключать любые сигналы, к которым подключен экземпляр объекта, когда он разрушается. Без ограниченных соединений вы должны вручную отключиться в деструкторе. Если вы забудете отключить экземпляры, когда они уничтожены, вы в конечном итоге вызовете недопустимые обработчики сигналов, что приведет к сбою ваших программ.

Другие вопросы по тегам