[岩禾溪] C++20项目 muduo网络库 项目实战 (3) Poller

 本项目由 岩禾溪 原创

项目实战+新特性用法介绍
开源代码+博客解析+视频讲解

GitHub+CSDN+BiliBili同步更新,三个平台同名【岩禾溪】

GitHub代码链接  GitHub - YanHeXi/muduo_cpp20

项目讲解视频连接:岩禾溪的个人空间-岩禾溪个人主页-哔哩哔哩视频

你的关注是我更新的最大动力

Poller.ixx

export module Poller;
import EventLoop;
import nocopyable;
import <vector>;
import Channel;
import Timestamp;
import <unordered_map>;
export class Poller : nocopyable
{
public:
    using ChannelList = std::vector<Channel *>;

    Poller(EventLoop *loop);
    virtual ~Poller() = default;

    virtual Timestamp poll(int timeoutMs, ChannelList *activeChannels) = 0;
    virtual void updateChannel(Channel *channel) = 0;
    virtual void removeChannel(Channel *channel) = 0;

    bool hasChannel(Channel *channel) const;

    static Poller *newDefaultPoller(EventLoop *loop);

protected:
    using ChannelMap = std::unordered_map<int, Channel *>;
    ChannelMap channels_;

private:
    EventLoop *ownerLoop_;
};

模块导出和导入:

  • 使用了 EventLoopnocopyablevectorChannelTimestampunordered_map 模块。
  • 通过 export 关键字导出了 Poller 类,使其能够被其他模块导入和使用。

Poller

  • 构造函数 Poller(EventLoop *loop)

    • 接受一个指向 EventLoop 对象的指针作为参数。
    • 初始化 Poller 类的成员变量。
  • 虚析构函数 virtual ~Poller() = default;

    • 虚析构函数,指定为默认实现。
  • 纯虚函数

    • virtual Timestamp poll(int timeoutMs, ChannelList *activeChannels) = 0;
    • virtual void updateChannel(Channel *channel) = 0;
    • virtual void removeChannel(Channel *channel) = 0;
    • 这些纯虚函数需要在派生类中进行实现,用于执行轮询、更新通道和移除通道的操作。
  • 成员函数 bool hasChannel(Channel *channel) const;

    • 检查指定通道是否存在于轮询器中。
  • 静态函数 static Poller *newDefaultPoller(EventLoop *loop);

    • 返回一个 Poller 指针,用于创建默认的轮询器对象。
  • 成员变量 ChannelMap channels_;

    • 使用无序映射来存储文件描述符和对应的通道对象,用于快速检索通道。
  • 保护成员 protected: EventLoop *ownerLoop_;

    • 保护类型的成员变量,指向所属的 EventLoop 对象。

Poller.cpp

import Poller;
import EventLoop;
import Channel;

Poller::Poller(EventLoop *loop)
    : ownerLoop_(loop)
{
}

bool Poller::hasChannel(Channel *channel) const
{
    auto it = channels_.find(channel->fd());
    return it != channels_.end() && it->second == channel;
}

Poller 类部分实现:

  • 构造函数 Poller::Poller(EventLoop *loop)

    • 接受一个指向 EventLoop 对象的指针作为参数,并在初始化列表中将其分配给 ownerLoop_ 成员变量。
  • 成员函数 bool Poller::hasChannel(Channel *channel) const

    • 该函数用于检查给定的通道对象是否存在于轮询器中。
    • 首先通过 channel->fd() 获取通道的文件描述符,然后在 channels_ 这个存储通道的无序映射中查找该文件描述符。
    • 如果找到了并且对应的通道对象就是传入的 channel,则返回 true,表示该通道存在于轮询器中。
    • 否则返回 false,表示该通道不存在于轮询器中或者文件描述符对应的通道与传入的 channel 不匹配。

功能:

  • hasChannel 函数用于在 Poller 类中检查指定的通道对象是否存在于轮询器中,并对其进行匹配检查。这有助于确认通道是否已经被添加到轮询器中进行事件监听。

总结

可以无所谓,不能无所获

                                        ——岩

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值