前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于腾讯云AI代码助手辅助实现一个C++定时器类的功能实现

基于腾讯云AI代码助手辅助实现一个C++定时器类的功能实现

原创
作者头像
晨星成焰
修改2024-08-14 08:14:02
1110
修改2024-08-14 08:14:02
举报
文章被收录于专栏:C++入门基础知识

前言

最近注意到了腾讯云AI代码助手这款辅助编码工具,正好自己又有一个项目上的小需求,故决定将其求助于AI实现。

开发背景

笔者最近在执行服务端客户端交互时,需要客户端投递一个事件给服务端后,要求服务端在接收到投递后不立刻执行客户端的请求,而是在过一段时间后于某某时刻执行该请求,并且中途可以选择取消执行该请求的需求,经过搜索得知这是一种名为定时器类的操作,并将其求助于腾讯云AI代码助手辅助实现

一个简单的示意图
一个简单的示意图

开发工具采取的是VSCODE

腾讯云AI助手的安装方式为在VSCODE中搜索Tencent Cloud AI Code Assistant,将其安装后重启VSCODE即可。

AI操作演示

使用AI之前需要明白自己想要什么功能,并给出相应的提示词

1.向AI提出要求

请给我生成一个基于C++的定时器类

其功能实现包括

一个存储到期时间键和对应回调函数的容器

一个计数器,用于生成每个定时器唯一的ID

一个存储最快触发的定时器到期时间的变量

需要实现的方法有

添加一个定时器,接收一个延迟时间和回调函数作为参数。计算定时器的到期时间,并结合计数器生成一个唯一的ID。如果新添加的定时器的到期时间早于已存在的定时器,则更新最快触发定时器的到期时间

根据定时器ID取消定时器的方法

检查是否有到期的定时器,并触发他们的回调函数

2.AI生成的初步代码

代码语言:cpp
复制
#include <iostream>
#include <map>
#include <functional>
#include <chrono>
#include <thread>

class Timer {
public:
    using Callback = std::function<void()>;

    Timer() : counter_(0) {}

    // 添加一个定时器
    int addTimer(int delayMillis, Callback cb) {
        auto expiration = std::chrono::steady_clock::now() + std::chrono::milliseconds(delayMillis);
        int id = ++counter_;
        timers_[id] = {expiration, cb};

        // 更新最快触发的定时器到期时间
        if (timers_.empty() || expiration < fastestExpiration_) {
            fastestExpiration_ = expiration;
        }

        return id;
    }

    // 根据定时器ID取消定时器
    void cancelTimer(int id) {
        timers_.erase(id);
    }

    // 检查是否有到期的定时器,并触发他们的回调函数
    void checkAndTrigger() {
        auto now = std::chrono::steady_clock::now();
        while (!timers_.empty() && timers_.begin()->second.expiration <= now) {
            auto& timerInfo = timers_.begin()->second;
            timerInfo.cb();
            timers_.erase(timers_.begin());
        }

        // 更新最快触发的定时器到期时间
        if (!timers_.empty()) {
            fastestExpiration_ = timers_.begin()->second.expiration;
        }
    }

private:
    int counter_;
    std::map<int, std::pair<std::chrono::steady_clock::time_point, Callback>> timers_;
    std::chrono::steady_clock::time_point fastestExpiration_ = std::chrono::steady_clock::now();
};

int main() {
    Timer timer;

    // 添加一个延迟500毫秒后触发的定时器
    int id1 = timer.addTimer(500, []() {
        std::cout << "Timer 1 triggered!" << std::endl;
    });

    // 添加一个延迟1000毫秒后触发的定时器
    int id2 = timer.addTimer(1000, []() {
        std::cout << "Timer 2 triggered!" << std::endl;
    });

    // 等待一段时间后检查并触发到期的定时器
    std::this_thread::sleep_for(std::chrono::milliseconds(600));
    timer.checkAndTrigger();

    // 取消一个定时器
    timer.cancelTimer(id1);

    // 再次等待一段时间后检查并触发到期的定时器
    std::this_thread::sleep_for(std::chrono::milliseconds(200));
    timer.checkAndTrigger();

    return 0;
}

3.AI生成的代码报错

AI毕竟不是万能的,也会出错

VSCODE报错如下

点击腾讯云AI代码助手提供的修复代码

会自动将报错代码及其行数传给腾讯云AI代码助手(o( ̄▽ ̄)d好用)

修复后

Timer.hpp

代码语言:cpp
复制
#pragma once

#include <iostream>
#include <map>
#include <functional>
#include <chrono>
#include <thread>

class Timer {
public:
    using Callback = std::function<void()>;

    int addTimer(int delayMillis, const Callback& cb) {
        auto expiration = std::chrono::steady_clock::now() + std::chrono::milliseconds(delayMillis);
        int id = ++counter_;
        timers_[id] = {expiration, cb};

        // 更新最快触发的定时器到期时间
        if (timers_.empty() || expiration < fastestExpiration_) {
            fastestExpiration_ = expiration;
        }

        return id;
    }

    // 根据定时器ID取消定时器
    void cancelTimer(int id) {
        timers_.erase(id);
    }

    // 检查是否有到期的定时器,并触发他们的回调函数
    void checkAndTrigger() {
        auto now = std::chrono::steady_clock::now();
        while (!timers_.empty() && timers_.begin()->second.first <= now) { // 修改这里
            auto& timerInfo = timers_.begin()->second;
            timerInfo.second(); // 修改这里
            timers_.erase(timers_.begin());
        }

        // 更新最快触发的定时器到期时间
        if (!timers_.empty()) {
            fastestExpiration_ = timers_.begin()->second.first; // 修改这里
        }
    }

private:
    int counter_;
    std::map<int, std::pair<std::chrono::steady_clock::time_point, Callback>> timers_;
    std::chrono::steady_clock::time_point fastestExpiration_ = std::chrono::steady_clock::now();
};

目前VSCODE已经无报错,运行试试

符合运行预期

4.自己写的一个演示用例

自己再写一个演示用例

代码语言:cpp
复制
#include<iostream>
#include "Timer.hpp"

void callback1() {
    std::cout << "Callback 1 called!" << std::endl;
}

void callback2() {
    std::cout << "Callback 2 called!" << std::endl;
}

int main() {
    Timer timer;

    // 添加第一个定时器,在1秒后触发
    timer.addTimer(1 * 1000, callback1);

    // 添加第二个定时器,在5秒后触发
    timer.addTimer(10 * 5, callback2);

    // 主循环,每隔一定时间检查定时器
    for(int i=0;i<11;i++)
    {
        
        std::cout << "It's now" << i << " second" << std::endl;
        timer.checkAndTrigger(); // 更新定时器
        Sleep(1000); // 等待1秒钟
    }
    

    return 0;
}

依然符合运行预期

一些AI生成的代码相关思考

1.询问AI该定时器类的详细解释

2. 提出疑问

3.让AI给予回答的演示例->uint32_t的解决

代码语言:cpp
复制
#pragma once

#include <iostream>
#include <map>
#include <functional>
#include <chrono>
#include <thread>

class Timer {
public:
    using Callback = std::function<void()>;

    int addTimer(int delayMillis, const Callback& cb) {
        auto expiration = std::chrono::steady_clock::now() + std::chrono::milliseconds(delayMillis);
        uint32_t id = ++counter_;
        timers_[id] = {expiration, cb};

        // 更新最快触发的定时器到期时间
        if (timers_.empty() || expiration < fastestExpiration_) {
            fastestExpiration_ = expiration;
        }

        return static_cast<int>(id); // 将uint32_t转换为int返回
    }

    // 根据定时器ID取消定时器
    void cancelTimer(int id) {
        timers_.erase(static_cast<uint32_t>(id)); // 将int转换为uint32_t再进行erase操作
    }

    // 检查是否有到期的定时器,并触发他们的回调函数
    void checkAndTrigger() {
        auto now = std::chrono::steady_clock::now();
        while (!timers_.empty() && timers_.begin()->second.first <= now) {
            auto& timerInfo = timers_.begin()->second;
            timerInfo.second();
            timers_.erase(timers_.begin());
        }

        // 更新最快触发的定时器到期时间
        if (!timers_.empty()) {
            fastestExpiration_ = timers_.begin()->second.first;
        }
    }

private:
    uint32_t counter_; // 使用uint32_t作为计数器类型
    std::map<uint32_t, std::pair<std::chrono::steady_clock::time_point, Callback>> timers_; // 使用uint32_t作为定时器ID类型
    std::chrono::steady_clock::time_point fastestExpiration_ = std::chrono::steady_clock::now();
};

获得的帮助与提升

基于腾讯云AI助手去实现一个定时器类大大减少了我的代码写作时间,对于其中的报错只需要轻轻的点一下快速修复就能完成,实乃不可多得的利器,但在使用的过程中,我也碰到了AI编写的代码报错的问题,并且在快速修复后仍然反复报错,AI生成了错误的代码,只有自己仔细勘察后才解决,可见AI也不是万能的,重点还是在于提升自身的水平,提升自身水平后不仅能让问的问题高效,也能洞察AI代码的问题所在,其作用不仅是对使用AI有帮助,也能提高日后项目开发时的能力。

结语

腾讯云AI代码助手虽然是个好东西,但我们也不能依赖AI,AI也会犯错,如果没有相应的代码审视能力,AI对于项目也可能会造成毁灭性的隐患,AI虽好,且行且珍惜。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 开发背景
  • AI操作演示
    • 1.向AI提出要求
      • 2.AI生成的初步代码
        • 3.AI生成的代码报错
          • 4.自己写的一个演示用例
          • 一些AI生成的代码相关思考
            • 1.询问AI该定时器类的详细解释
              • 2. 提出疑问
                • 3.让AI给予回答的演示例->uint32_t的解决
                • 获得的帮助与提升
                • 结语
                相关产品与服务
                腾讯云AI代码助手
                腾讯云 AI 代码助手,是一款辅助编码工具,基于混元代码大模型,提供技术对话、代码补全、代码诊断和优化等能力。为你生成优质代码,帮你解决技术难题,提升编码效率。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档