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