[英]Handle connection/disconnection of many signals/slots with boost::signals2
我已經開始使用 boost::signals2 而不是我的舊信號代碼。 不過,我在管理多個連接時遇到了問題。 這是我的問題:
我有很多 class 人的實例:
class Person {
public:
void SetName (string new_name)
{
name = new_name;
NameChange (name);
}
string name;
boost::signals2::signal<Person*> NameChange;
};
我還有一個人員瀏覽器,它必須監視所有可用人員的子集以進行更改。 由於人們可以從該子集中來 go 我必須有一種方法來處理連接對象,並且我創建了一個 class (ConnectionList) 來處理它:
class ConnectionList
{
public:
virtual ~ConnectionList () // drops all connections in "list"
void add (boost::signals2::connection& conn); // adds "conn" to "list"
private:
std::vector<boost::signals2::connection> list;
};
class PeopleBrowser
{
public:
void AddPerson (Person& p)
{
name_change_connections.add (p.NameChange.connect (...));
}
private:
ConnectionList name_change_connections;
};
這一切都很好,刪除 PeopleBrowser 時連接會被刪除,並且有一種添加新連接的好方法。
但是,我們需要添加另一個方法 RemovePerson,並且該方法必須刪除與該 Person 實例的 NameChange 信號的連接。
這就是我卡住的地方。 我想我可以使 ConnectionList 成為一個模板,並使用一個列表來保存一個引用信號和連接的結構,然后添加一個方法來刪除該信號的所有連接。
但似乎這是一個很常見的情況(至少在我的世界里,我在這個單一的應用程序中有 20 個需要這個功能的類),所以我認為必須有更好的方法來處理這個問題?
至少,有沒有辦法從連接 object 中獲取對連接信號的引用?
也許 libsigc++ 處理這個更好/不同?
關於什么:
class PeopleBrowser
{
public:
void AddPerson (Person& p)
{
name_change_connections[&p] = p.NameChange.connect(...);
}
void RemovePerson(Person& p)
{
name_change_connections.erase(&p);
}
private:
std::map<Person*, boost::signals2::scoped_connection> name_change_connections;
};
您可能還想看看自動連接管理。
我自己沒有嘗試過,但根據boost 文檔
何時會發生斷線? (中間的)
當出現以下任何一種情況時,就會發生信號/插槽斷開:
- 直接通過連接的
disconnect
方法或通過信號的disconnect
方法或scoped_connection
的析構函數間接顯式斷開連接。- 被槽跟蹤的 object 被銷毀。
- 信號被破壞。
除非您使用scoped_connection
,否則信號和插槽之間的連接將保持有效,直到它們中的任何一個被破壞。 據我了解,您不需要將連接對象存儲在向量中。 只需像現在一樣將信號連接到插槽即可。
當您觀察到的 object 超出 scope 時,它將自行刪除連接。
這是一個更簡單的設計。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.