请求-响应系统

request-response system

本文关键字:系统 响应 请求      更新时间:2023-10-16

我有具有相应响应对象的请求对象。发送方对象发出请求,然后侦听响应。一个发送方/侦听器对象可以发送不同的请求。每个请求都会进入全局队列,处理后,会将相应的响应发送到每个侦听器对象。

您的问题有几种解决方案。一种是,收发器通知所有对象Request其销毁。为此,您需要一种类似 Request对象用来注册自身的Transceiver::addRequest()。在Transceiver析构函数您必须通知所有注册Request。例如:

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已经死了。

编辑:添加了一种方法,如果RequestTransceiver之前被销毁,则可以删除该。