在遍历处理程序的向量时注册和注销处理程序
Register and unregister a handler while iterating throught the vector of handlers
我有一个非常小的程序,它启动一个线程并将事件分派到已注册的处理程序集。Handlers类如下所示。
class Handler
{
public:
/* OnEvent must return void. This is part of the user interface agreement */
virtual void OnEvent(struct Event*) = 0;
virtual ~Handler();
};
处理程序保存在矢量内
std::vector<Handler*> handlers;
我可以使用register函数向向量添加一个处理程序并使用unregister函数从向量中删除处理程序。处理人员可以可以在OnEvent函数中添加或删除。
原型低于
void registerHandler(Handler *h);
void unregisterHandler(Handler *h);
线程函数如下所示。它将阻塞事件,一旦接收到事件,它将把这个事件分派给向量中的每个处理程序
void thread_function()
{
struct Event* e = getEvent();
/* Function will receive an event and will invoke handlers one by one */
for(auto s = 0; s < handlers.size(); ++s)
{
/* Register and unregister function can be called inside OnEvent. */
handlers[s]->OnEvent();
}
}
在OnEvent函数内部的向量中添加和删除处理程序的最佳方式是什么?
我的想法是。当在OnEvent内部调用register时,我将把一个处理程序推回到处理程序列表中。但我想不出如何从向量中删除处理程序。如果我从向量中删除一个处理程序,迭代器将不再有效。听到你们的想法会很有趣的,伙计们。
谢谢
如果处理程序更改仅在事件处理后生效,则可以复制处理程序数组:
std::vector<Handler*> handlers;
void thread_function(){
struct Event* e = getEvent();
std::vector<Handler*> handlersCopy = handlers;
for(Handler* h : handlersCopy) {
h->OnEvent();
}
}
如果你想阻止处理在处理过程中被删除的处理程序,你可以这样做:
std::vector<Handler*> handlers;
bool isDispatching = false;
std::unordered_set<Handler*> disabledHandlers;
void unregisterHandler(Handler *h){
handlers.erase(handlers.find(h));
if (isDispatching){
disabledHandlers.insert(h);
}
}
void thread_function(){
struct Event* e = getEvent();
isDispatching = true;
std::vector<Handler*> handlersCopy = handlers;
for(Handler* h : handlersCopy) {
if(disabledHandlers.find(h) != disabledHandlers.end()){
continue;
}
h->OnEvent();
}
isDispatching = false;
disabledHandlers.clear();
}
相关文章:
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 为什么我的 IExtractIcon 处理程序没有被调用?
- 在遍历处理程序的向量时注册和注销处理程序
- 有可能在信号处理程序中设置promise吗
- 在信号处理程序中捕获C++未处理的异常并恢复应用程序
- 在C++程序中使用的迭代器中未处理的异常
- 有关图像处理应用程序的硬件和软件安全性的建议
- 通过安装信号处理程序关闭多线程应用程序
- QDateTime::toString() 在退出处理程序中使用时失败
- 如何在 WindowProc 处理程序中区分箭头键和数字键盘?
- async_write完成处理程序最早何时完成?
- C++事件系统 - 多态事件和事件处理程序
- 使用信号处理程序处理从 FIFO 接收的数据
- 使用独立的 c++ 程序处理用 C 编写的字符设备驱动程序
- C 程序处理两个文件,而不是一个文件
- 是什么让这个程序处理缓慢?(C++)
- QT 中的应用程序>处理消息?
- MongoDB C++驱动程序处理副本集连接故障
- 使用 OpenCV 程序处理多页 PDF