qt开发客户端项目,会出现监听日志重复打印问题。
- 开发工具: qt creator 4.8.0
- 事件:
void MainWindow::showEvent(QShowEvent *event) - 业务情景: 使用socket编程,创建服务端监听外部设备的连接。当只有一个设备连接到服务端后,对设备进行监听。如设备提供的电压、电流 出现问题,或者设备没了心跳 ,以及联网断线 ,都会打印日志 以及给出报警提示 ,并且还会有报警提示音
- 异常情况: 当上述业务场景中设备异常 ,就会产生
多次报警,影响产品使用体验 ,并且还会打印多个重复日志。 - 问题原因: showEvent事件 会重复执行 ,导致创建多个服务器server实例注册多次重复监听,会导致问题。
- 解决方法: 增加校验参数。判断页面是否是初次打开。
- 问题排查思路: 此问题不容易发现,本机几乎很难发现此问题,会因人使用电脑的操作习惯不同 容易触发此bug。
- 下面是关键代码: 主页面页面展示时注册的监听回调方法,每次隐藏主页面打开时都会执行此方法。
c++
void MainWindow::showEvent(QShowEvent *event) {
// 设置当前用户名(每次显示都需要更新)
this->ui->loginName->setText(QString("当前登录用户: %1").arg(this->loginName));
this->initStatusDesc();
// 只在首次显示时执行初始化
if (isFirstShow) {
isFirstShow = false;
// 页面显示时启动定时器(只在首次启动)
tipTimer->start(5000);
clockTimer->start(1000);
// 添加提醒监听
connect(this->tipManager, &DevTipManager::timeoffTip, this, [=](DevErrorMsgDTO devErrMsgDto){
// 打印控制台
this->consolePrint(devErrMsgDto.errorMsgEnHance);
// 异常提醒
this->popErrorMsg(devErrMsgDto);
});
// 初始化服务器
iniTcpServer();
// 添加离线监控
Myapp::Pairs onlinePairsConfig = Myapp::getPairsByKey(Myapp::DEADLINE_LIMIT_TIME);
devOnlineMgr = new DevOnlineManager(this, &onlinePairsConfig);
// 添加离线设备监控
initSystemSetListener();
}
// 触发故障检查(每次显示都需要执行)
emit SignalRelayer::instance()->updateStatus();
}
总结
- 发现问题的思路:有些问题是操作习惯原因,很难发现,可以询问AI解决,此问题就是它抓到的。
- 有的时候我们认为AI只会编程,只会修改自己编写的程序bug,其实任何事情只要让他理解后都能尽职起到作用。
- 这次用的AI是在编程工具Cursor中使用的GPT-5.1 codex找到的问题。