跟踪升压信号的连接计数

时间:2014-08-23 16:50:26

标签: boost signals-slots

如果与 boost :: signal2 :: signal 对象的连接数量发生变化,我尝试存档的目的是获取更新。

为您提供全貌:我正在编写一个显示远程服务器数据的GUI应用程序。每个"窗口"在应用程序中应该获取特定数据集的数据。如果要显示数据集,则需要从服务器远程订阅。多个窗口可以显示相同的数据集(具有不同的排序或过滤)。我的目标是仅订阅特定数据集ONCE并断开不再需要的数据集。

背景:HFT软件,显示marketdata(订单,交易......)

到目前为止我的代码:一旦我尝试实现"运算符()"我就陷入困境。

enum UpdateCountMethod {
  UP = 1,
  DOWN = -1
};


/**
 * \brief Connection class which holds a Slot as long as an instance of this class "survives".
 */
class Connection {
public:
  Connection(const boost::function<void (int)> updateFunc, const boost::signals2::connection conn) : update(updateFunc), connection(conn) {
    update(UP); //Increase counter only. Connection was already made.
  }

  ~Connection() {
    update(DOWN); //Decrease counter before disconnecting the slot.
    connection.disconnect();
  }

private:
  const boost::function<void(int)> update; // Functor for updating the connection count.
  const boost::signals2::connection connection; // Actual boost connection this object belongs to.
};


/**
 * \brief This is a Signal/Slot "container" which number of connections can be tracked.
 */
template<typename Signature>
class ObservableSignal{
  typedef typename boost::signals2::slot<Signature> slot_type;

public:
  ObservableSignal() : count(0) {}

  boost::shared_ptr<Connection> connect(const slot_type &t) {
    // Create the boost signal connection and return our shared Connection object.
    boost::signals2::connection conn = signal.connect(t);
    return boost::shared_ptr<Connection>(new Connection(boost::bind(&ObservableSignal::updateCount, this, _1), conn));
  }


  // This is where I don't know anymore.
  void operator() (/* Parameter depend on "Signature" */) {
    signal(/* Parameter depend on "Signature" */); //Call the actual boost signal
  }

private:

  void updateCount(int updown) {
    // TODO: Handle subscription if count is leaving or approaching 0.
    count += updown;
    std::cout << "Count: " << count << std::endl;
  }

  int count; // current count of connections to this signal
  boost::signals2::signal<Signature> signal; // Actual boost signal
};

0 个答案:

没有答案