代码优化建议:避免资源信息被覆盖

非常抱歉之前的回答仍然没有满足您的需求。经过再次检查您的代码,我注意到在 show_cpu_status() 函数中,您先调用了 clear_cpu_info_() 来清除资源占用信息,然后在同一个循环中更新资源占用信息并发布。这可能导致问题,因为 clear_cpu_info_() 函数实际上会重新打开 cpu_info.msg 文件并读取所有进程的信息,这将会覆盖掉您之前更新的信息。

为了解决这个问题,我建议您在 show_cpu_status() 函数中先备份 cpu_info_,然后在更新资源占用信息之前恢复备份。这样,您可以保留之前更新的信息,并仅更新有变化的部分。以下是修改后的示例代码:

void MONITOR_BASE::show_cpu_status()
{
    std::vector<ProcessInfo1> process_info = getTopProcesses_CPU(MONITOR_CONSTANT::FIFTY);
    LOG(INFO) << 'CPU Temperature: ' << getCpuTemperature() << '℃';

    auto backup_cpu_info = cpu_info_;  // 备份 cpu_info_

    clear_cpu_info_();  // 清除资源占用信息

    for (const auto& ele : process_info)
    {
        if (isSubstring(std::string(std::getenv('AUTO_ROOT')), ele.COMMAND) && ele.COMMAND != '')
        {
            LOG(INFO) << 'Process(' << getLastElement(ele.COMMAND)
                      << ') take CPU(' << ele.CPU
                      << '%), MEM(' << ele.MEM
                      << '%), VSZ(' << ele.VSZ / 1024 << ' MB)';
            std::string process_name = getLastElement(ele.COMMAND);
            module_cpu_info(process_name, ele.CPU, ele.MEM, ele.VSZ);
        }
    }

    // 恢复备份的 cpu_info_
    cpu_info_ = backup_cpu_info;

    pub_memory_.publish(cpu_info_);
}

在这个修改后的示例代码中,我们先备份了 cpu_info_backup_cpu_info,然后调用 clear_cpu_info_() 清除资源占用信息。在更新完资源占用信息后,我们恢复了备份的 cpu_info_,以保留之前更新的信息。

希望这次的回答能够满足您的需求。非常抱歉之前的错误回答给您带来的困扰。如果您还有任何其他问题,请随时提问。

代码优化建议:避免资源信息被覆盖

原文地址: https://www.cveoy.top/t/topic/FYW 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录