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

2024-08-14 08:14:02 浏览数 (2)

前言

最近注意到了腾讯云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虽好,且行且珍惜。

0 人点赞