события через хаб
Подробнее - есть объекты-потребители, есть объекты провайдеры и есть хаб провайдеров. Потребители работают в своих потоках и когда подписываются на события, предоставляют хабу коллбек. Хаб в свою очередь смотрит, от какого провайдера может прийти такое событие и подписывается на него туда, где нашел. События трех типов могут быть - bool, int, double. У bool свои айдишники, у int и double - общие. Потокобезопасность на переходе потребители-хаб я разрулил, а вот как правильнее сделать на связке провайдеры-хаб, закопался
Сейчас примерно вот так
class IProvider {
...
virtual bool setCallbackOnBool(std::function<void(BoolID, bool)>) = 0;
virtual bool setCallbackOnInt(std::function<void(NumericID, int)>) = 0;
virtual bool setCallbackOnDouble(std::function<void(NumericID, double)>) = 0;
virtual bool subscribeOnBool(BoolID) = 0;
virtual bool subscribeOnNumeric(NumericID) = 0;
};
class IProviderHub {
virtual void subscribeOnBool(std::weak_ptr<IConsumer> condition, BoolID) = 0;
virtual void subscribeNumeric(std::weak_ptr<IConsumer> condition, NumericID) = 0;
};
Провайдеры могут сгенерить события в любой момент, даже параллельно, но каждый провайдер сам по себе выдает их синхронно
Как было бы лучше организовать такую асинхронную подписку?
По моему вопрос не по С++ а по архитектуре, может в @pro_prog лучше?
Обсуждают сегодня