簡體   English   中英

使用 boost::signals2 處理許多信號/插槽的連接/斷開

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM