управление подключением буст-сигналов - PullRequest
3 голосов
/ 21 сентября 2011

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

Ответы [ 2 ]

7 голосов
/ 21 сентября 2011

Вам не нужно хранить connection экземпляров, вы должны иметь возможность отключиться от сигнала, передав исходный вызываемый элемент в signal::disconnect, как описано в учебнике Boost.Signals .С функциями-членами проблема скорее в том, что вы не можете передать их напрямую в signal, вы либо заключаете их в объекты пользовательских функций, которые затем будут доступны в качестве аргументов для signal::disconnect, либо используете Boost.Bind , что само по себе не очень полезно, поскольку вы не можете удобно объявить тип возвращаемого значения.Однако эту проблему можно решить с помощью Boost.Bind вместе с Boost.Function .

Надеюсь, я ответил на ваш вопрос.

6 голосов
/ 05 августа 2012

Scoped Connections

В качестве альтернативы вы можете назначить возвращаемое соединение переменной типа signal :: scoped_connection . Это тип соединения , который автоматически отключается при уничтожении или переназначении . Это эффективно ограничивает время жизни сигнального слота для конкретной области.

Например, когда вы переназначаете myConnection, предыдущее соединение автоматически отключается:

scoped_connection myConnection = someObject.Signal.connect(MyHandler);
myConnection = totallyDifferentObject.Signal.connect(MyHandler);


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

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

...