请求-响应系统
request-response system
我有具有相应响应对象的请求对象。发送方对象发出请求,然后侦听响应。一个发送方/侦听器对象可以发送不同的请求。每个请求都会进入全局队列,处理后,会将相应的响应发送到每个侦听器对象。
您的问题有几种解决方案。一种是,收发器通知所有对象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
已经死了。
编辑:添加了一种方法,如果Request
在Transceiver
之前被销毁,则可以删除该。
相关文章:
- C++,系统无法执行指定的程序
- 在UNIX系统中使用DIR查找文件的字节大小
- 错误处理.将系统错误代码映射到泛型
- 当系统的卷被修改时,如何修改WASAPI环回捕获卷
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 在C++游戏中与库存系统作斗争
- 文件系统:复制功能的速度秘诀是什么
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 在gtest.中使用fff.h模拟系统API
- 如何制作无限制照明系统
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 如何传递多个 std::文件系统选项?
- 当服务中的事件被触发时,如何将响应从服务发送回客户端?
- 遍历顺序由 std::文件系统directory_iterator给出
- Shell_NotifyIcon在系统托盘中创建空白、无响应的图标
- 读取系统() 命令错误响应消息
- 请求-响应系统
- 系统停止响应并抛出yami i/o错误
- 系统托盘图标没有响应
- Pin质询响应系统