система запрос-ответ

У меня есть объекты запроса с соответствующими объектами ответа. Объект отправителя делает запрос и затем слушает ответ. Один объект отправителя / прослушивателя может отправлять разные запросы. Каждый запрос попадает в глобальную очередь, и после его обработки каждому объекту слушателя отправляется соответствующий ответ.

1

Решение

Есть несколько решений вашей проблемы. Можно было бы сказать, что трансивер информирует все Request объект о его уничтожении. Для этого вам понадобится такой метод, как
Transceiver::addRequest() который Request Объект использует для регистрации себя. в
деструктор Transceiver Вы должны сообщить всем зарегистрированным Request«S. Например:

class Transceiver
{
virtual ~Transceiver()
{
for (auto request : m_requests)
request->deleteTransceiver(this);
}

void addRequest(Request* r)
{
m_requests.push_back(r);
}

void removeRequest(Request* r)
{
m_requests.erase(std::remove(m_requests.begin(), m_requests.end(), r),
m_requests.end());
}

std::vector<Request*> m_requests;
};

class Request
{
virtual void deleteTransceiver(Transceiver* t) = 0;
virtual void notify() = 0;
};

class RequestImpl : public Request
{
RequestImpl(Transceiver* t)
: m_target(t)
{
if (t)
t->addRequest(this);
}

~RequestImpl()
{
if (m_target)
m_target->removeRequest(this);
}

virtual void deleteTransceiver(Transceiver* t)
{
if (m_target == t)
m_target = 0;
}

virtual void notify()
{
if (m_target)
m_target->process(ResponseType());
}

Transceiver* m_target;
};

Вторым подходом, конечно, было бы предотвращение разрушения Transceiver как
Пока он используется. Вы могли бы использовать std::shared_ptr<Transceiver> m_target в
Request класс, что означает, что приемопередатчик живет по крайней мере столько же, сколько соответствующий запрос.

Для большей гибкости есть также возможность std::weak_ptr<Transceiver>, Тогда трансивер может быть уничтожен, когда запрос
все еще жив. Тем не менее, когда вы пытаетесь std::weak_ptr<Transceiver>::lock() и это
не удается, вы знаете, что Transceiver мертв.

Редактировать: Добавлен метод для удаления Request если он разрушен до его Transceiver,

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector