当前位置: 首页 > news >正文

C++ QT 工具日志异步分批保存

C++ QT 工具软件一般可以如此实现日志保存:

#define THREAD_ID (reinterpret_cast<qulonglong>(QThread::currentThreadId()) & 0x0FFF)
#define TIME (QDateTime::currentDateTime().toString("yyyy_MM_dd_hh_mm_ss_zzz"))#define LOGD(msg) qDebug()<<QString("[%1] [%2] [D] [%3] %4") \
.arg(TIME)\
.arg(THREAD_ID , 4) \
.arg(QString(TAG).mid(0,20) , 20 , QChar(' ')) \
.arg((msg));

当qDebug数据更新时,将日志更新到ui界面上,

存储日志时,将日志从ui界面导出,然后存储在本地

但是存在一个问题:

主线程中存储log可能会造成线程阻塞,界面失去响应

void ClassA::on_save_clicked()
{if (mFilePath.length() > 0){QFile file(mFilePath);if (file.open(QIODevice::WriteOnly | QIODevice::Text)){QTextStream stream(&file);stream << ui->plainTextEdit->toPlainText();}file.close();}
}

针对Qt中避免主线程卡死的问题,可以通过以下几种技术来避免:

  1. 使用多线程:将耗时的文件写入操作放在一个单独的线程中执行,这样可以避免阻塞主线程。在Qt中,可以使用QThread类来创建一个新线程,并在该线程中执行文件写入操作。这样可以确保主线程的响应性,不会因为长时间的文件操作而卡死。

  2. 异步编程:使用Qt的信号和槽机制,将文件写入操作异步化。您可以创建一个槽函数来处理文件写入,并在需要保存数据时发射一个信号,槽函数在接收到信号后异步执行文件写入操作。这样可以避免在主线程中同步执行耗时的文件操作。

  3. 使用TaskPool:如果您的应用是基于鸿蒙系统,可以使用系统自带的TaskPool多线程能力,将耗时任务交由子线程执行,避免主线程的长时间阻塞。

  4. 分批处理数据:类似于Linux的logcat技术,您可以将大量数据分批次写入文件,每次只处理一小部分数据,这样可以减少单次操作的时间,避免长时间的阻塞。

  5. 使用QCoreApplication::processEvents:在执行耗时操作时,偶尔调用QCoreApplication::processEvents()来处理所有挂起的事件,这样可以保持界面的响应性

eg1:

    void ClassA::on_save_clicked() {if (mFilePath.length() > 0) {QFile file(mFilePath);if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {QTextStream stream(&file);int batchSize = 1024 * 1024; int totalDataSize = ui->plainTextEdit->toPlainText().length();int offset = 0;while (offset < totalDataSize) {int chunkSize = qMin(batchSize, totalDataSize - offset);QString chunk = ui->plainTextEdit->toPlainText().mid(offset, chunkSize);stream << chunk;offset += chunkSize;// 处理完一批数据后,给主事件循环一些时间来处理其他事件QCoreApplication::processEvents();// 可以在这里添加一个简单的延时来控制写入速度,避免过于频繁// QThread::msleep(10); // 例如,每次写入后暂停10毫秒}file.close();}}}

eg2:

void ClassA::on_save_clicked()
{if (mFilePath.length() > 0){QtConcurrent::run([&](){QFile file(mFilePath);if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {QTextStream stream(&file);int batchSize = 1024 * 1024;int totalDataSize = ui->plainTextEdit->toPlainText().length();int offset = 0;while (offset < totalDataSize) {int chunkSize = qMin(batchSize, totalDataSize - offset);QString chunk = ui->plainTextEdit->toPlainText().mid(offset, chunkSize);stream << chunk;offset += chunkSize;}file.close();}emit logSaved();});}
}

更好的方法是在log server接收数据时保存

实时进行Log的临时保存,然后在需要保存的时候,将文件直接move到你想要保存的地方

相关文章:

C++ QT 工具日志异步分批保存

C QT 工具软件一般可以如此实现日志保存&#xff1a; #define THREAD_ID (reinterpret_cast<qulonglong>(QThread::currentThreadId()) & 0x0FFF) #define TIME (QDateTime::currentDateTime().toString("yyyy_MM_dd_hh_mm_ss_zzz"))#define LOGD(msg) qD…...

win32com库基于wps对Word文档的基础操作

win32com库基于wps对Word文档的基础操作 文章目录 win32com库基于wps对Word文档的基础操作新建/打开文档段落操作(Paragraph)字体设置(Font)图表操作(Shape) 参考链接: WAS API手册 新建/打开文档 import win32com import win32com.client as win32 # 启动WPS进程 word_obj …...

Kubernetes 网络之深度探索:网络模型与 CNI 插件

Kubernetes 网络之深度探索:网络模型与 CNI 插件 在 Kubernetes 中,网络是一个至关重要的组成部分。它不仅决定了容器之间如何通信,还影响着整个集群的可扩展性和稳定性。本节课将深入剖析 Kubernetes 的网络模型以及 CNI(Container Network Interface)网络插件。 一、K…...

Go 模块管理教程:go.mod 与依赖版本控制

Go 模块管理教程&#xff1a;go.mod 与依赖版本控制 Go 从版本 1.11 开始引入了 Go Modules&#xff0c;通过 go.mod 文件来管理项目的依赖关系和版本。Go 模块系统大大简化了 Go 项目的依赖管理&#xff0c;解决了之前 GOPATH 模式的许多问题。本教程将介绍如何使用 Go 模块管…...

大数据 ETL + Flume 数据清洗 — 详细教程及实例(附常见问题及解决方案)

大数据 ETL Flume 数据清洗 — 详细教程及实例 1. ETL 和 Flume 概述1.1 ETL&#xff08;Extract, Transform, Load&#xff09;1.2 Flume 概述 2. Flume 环境搭建2.1 下载并安装 Flume2.2 启动 Flume 3. Flume 配置和常见 Source、Sink、Channel3.1 Flume Source3.2 Flume Si…...

鸿蒙next版开发:订阅应用事件(ArkTS)

在HarmonyOS 5.0中&#xff0c;ArkTS提供了强大的应用事件订阅机制&#xff0c;允许开发者订阅和处理系统或应用级别的事件。这一功能对于监控应用行为、优化用户体验和进行性能分析至关重要。本文将详细介绍如何在ArkTS中订阅应用事件&#xff0c;并提供示例代码进行说明。 应…...

F litter 开发之flutter_local_notifications

flutter_local_notifications 消息通知 flutter_local_notifications地址 flutter_local_notifications: ^18.0.1class NotificationHelper {//工厂模式调用该类时&#xff0c;默认调用此方法&#xff0c;将实例对象返回出去static NotificationHelper? _instance null;sta…...

springboot参数校验

springboot 参数校验 Validated 以及 Valid - 唏嘘- - 博客园 SpringBoot参数校验Validated、Valid_springboot validate-CSDN博客...

Spring生态学习路径与源码深度探讨

引言 Spring框架作为Java企业级开发中的核心框架&#xff0c;其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身&#xff0c;更需要深入理解其周边组件和工具&#xff0c;以及源码的底层实现逻辑。本文将从Spring生态的学…...

C++:set详解

文章目录 前言一、set概念介绍二、set的使用1. 插入删除相关2. 查找相关1&#xff09;find2&#xff09;count3&#xff09;lower_bound与upper_bound4&#xff09;equal_range 三、set的值是不能修改的原理四、基于哈希表的set总结 前言 根据应用场景的不同&#xff0c;STL总…...

(一)- DRM架构

一&#xff0c;DRM简介 linux内核中包含两类图形显示设备驱动框架&#xff1a; FB设备&#xff1a;Framebuffer图形显示框架; DRM&#xff1a;直接渲染管理器&#xff08;Direct Rendering Manager&#xff09;&#xff0c;是linux目前主流的图形显示框架&#xff1b; 1&am…...

Docker了解

Docker是一种容器化技术&#xff0c;它可以将应用程序和其依赖项打包到一个独立的、可移植的容器中&#xff0c;以便在不同的环境中运行。Docker基于Linux操作系统的容器化技术&#xff0c;可以提供更轻量、更快速、更灵活、更一致的应用部署和管理方式。 Docker的基本概念包括…...

【DL】YOLO11 OBB目标检测 | 模型训练 | 推理

本文进行YOLO11的旋转目标检测任务,旋转目标检测能够更精确地定位和描述那些非水平排列的目标,比如倾斜的飞机、船舶等。在原始的目标检测中,添加一个角度预测,实现定向边界框检测。 话不多说,先来个效果图!!! YOLO11中的旋转目标检测的特点 ▲更精确的定位:通过使用…...

vue读取本地excel文件并渲染到列表页面

1.安装插件(版本0.18.5) npm i xlsx 2.封装插件 <template><div class"container"><slot></slot></div> </template><script> import * as XLSX from xlsx export default {name: ReadExcel,props: {filePath: {type: …...

github 以及 huggingface下载模型和数据

runningcheese/MirrorSite: 镜像网站合集 (github.com) huggingface 下载模型和数据使用snapshot_download的方法 不会修改HuggingFace模型下载默认缓存路径&#xff1f;一篇教会你!_huggingface默认下载路径-CSDN博客 下载模型 使用snapshot_download 使用snapshot_down…...

使用 Vue 配合豆包MarsCode 实现“小恐龙酷跑“小游戏

作者&#xff1a;BLACK595 “小恐龙酷跑”&#xff0c;它是一款有趣的离线游戏&#xff0c;是Google给Chrome浏览器加的一个有趣的彩蛋。当我们浏览器断网时一只像素小恐龙便会出来提示断网。许多人认为这只是一个可爱的小图标&#xff0c; 但当我们按下空格后&#xff0c;小恐…...

51c视觉~合集6

我自己的原文哦~ https://blog.51cto.com/whaosoft/11603901 #CSWin-UNet 将自注意力机制集成到UNet中&#xff01;CSWin-UNet&#xff1a;U型分割方法&#xff0c;显著提高计算效率和感受野交互&#xff01;本文提出了CSWin-UNet&#xff0c;这是一种新颖的U型分割方法&…...

STM32(hal库)在串口中,USART和uart有什么区别?

在STM32的HAL库中&#xff0c;USART和UART都是用于串口通信的模块&#xff0c;但它们在功能特性和使用场景上存在一些区别。以下是对两者的详细比较&#xff1a; 一、功能特性 UART&#xff08;通用异步收发器&#xff09;&#xff1a; 是一种串行、异步、全双工的通信协议。通…...

机器学习、深度学习面试知识点汇总

下面是本人在面试中整理的资料和文字&#xff0c;主要针对面试八股做浅显的总结&#xff0c;大部分来源于ChatGPT&#xff0c;中间有借鉴一些博主的优质文章&#xff0c;已经在各文中指出原文。有任何问题&#xff0c;欢迎随时不吝指正。 文章系列图像使用动漫 《星游记》插图…...

FPGA高速设计之Aurora64B/66B的应用与不足的修正

FPGA高速设计之Aurora64B/66B的应用与不足的修正 Aurora IP协议的特点 首先基于网上找到的一些资料&#xff0c;来讲述下Aurora高速协议的特点与相关的应用。Aurora 协议在 2002 年由 Xilinx 公司首次提出&#xff0c;是由Xilinx提供的一个开源、免费的链路层串行传输通信协议…...

Hunyuan-MT-7B企业部署案例:出海SaaS公司集成Pixel Language Portal构建内部翻译中台

Hunyuan-MT-7B企业部署案例&#xff1a;出海SaaS公司集成Pixel Language Portal构建内部翻译中台 1. 项目背景与挑战 随着全球化业务扩张&#xff0c;某出海SaaS公司面临多语言支持的核心痛点&#xff1a; 翻译需求激增&#xff1a;产品文档、用户界面、客服对话等需要支持3…...

肿瘤免疫微环境解析:8大免疫浸润工具实战指南

1. 肿瘤免疫微环境分析的核心价值 当你拿到一份肿瘤样本的转录组数据时&#xff0c;最令人兴奋的莫过于揭开它的免疫面纱——那些隐藏在肿瘤组织中的免疫细胞究竟在做什么&#xff1f;这就是免疫浸润分析的价值所在。想象一下&#xff0c;肿瘤组织就像一座复杂的城市&#xff0…...

学习神经网络

一、神经网络概述&#xff1a;人工智能的核心基石&#xff08;一&#xff09;神经网络的定义与起源神经网络&#xff0c;全称为人工神经网络&#xff08;Artificial Neural Network&#xff0c;ANN&#xff09;&#xff0c;是一种模仿生物神经网络&#xff08;动物大脑神经元网…...

ESP32开发环境:VS Code与ESP-IDF插件高效配置指南

1. 为什么选择VS Code开发ESP32&#xff1f; 第一次接触ESP32开发时&#xff0c;我尝试过各种开发工具&#xff1a;Arduino IDE、PlatformIO、Eclipse...最后发现VS Code配合ESP-IDF插件才是最佳组合。这个方案不仅免费开源&#xff0c;更重要的是能充分发挥ESP32的全部性能特…...

探索CVE-rs:安全漏洞数据库的 Rust 实现

探索CVE-rs&#xff1a;安全漏洞数据库的 Rust 实现 【免费下载链接】cve-rs Blazingly &#x1f525; fast &#x1f680; memory vulnerabilities, written in 100% safe Rust. &#x1f980; 项目地址: https://gitcode.com/GitHub_Trending/cv/cve-rs 项目简介 是一…...

浦语灵笔2.5-7B精彩案例分享:手写体题目识别+解题逻辑生成全过程

浦语灵笔2.5-7B精彩案例分享&#xff1a;手写体题目识别解题逻辑生成全过程 1. 引言&#xff1a;当AI“看懂”你的手写作业 想象一下这个场景&#xff1a;你正在辅导孩子做数学作业&#xff0c;他遇到一道难题&#xff0c;不仅把题目抄了下来&#xff0c;还在旁边画了辅助线、…...

智慧园区能源管理系统解决方案

某园区集成生产、办公、生活三大功能&#xff0c;建设有生产厂房、化学品库、辅助用房、气罐站、研发楼、综合楼及其他配套设施&#xff0c;涉及到多种用能&#xff0c;包含电能、天然气、压缩空气、冷热能等&#xff0c;带来日益高昂的能耗成本与能源浪费隐患。 1、制冷空调监…...

3步实现视频硬字幕精准提取:本地化多语言解决方案如何解决你的字幕难题

3步实现视频硬字幕精准提取&#xff1a;本地化多语言解决方案如何解决你的字幕难题 【免费下载链接】video-subtitle-extractor 视频硬字幕提取&#xff0c;生成srt文件。无需申请第三方API&#xff0c;本地实现文本识别。基于深度学习的视频字幕提取框架&#xff0c;包含字幕区…...

从零部署到实战标注:SUSTechPOINTS 3D点云标注平台全流程指南

1. 为什么选择SUSTechPOINTS进行3D点云标注 在自动驾驶研发过程中&#xff0c;3D点云标注是个绕不开的苦差事。我最早用过不少商业标注工具&#xff0c;不是价格贵得离谱&#xff0c;就是功能残缺不全。直到去年团队接手一个校企合作项目&#xff0c;才发现南方科技大学开源的这…...

Linux 内核遍历宏介绍

Linux内核中的遍历宏全面详解 Linux内核中大量使用遍历宏&#xff08;Iteration Macros&#xff09;来简化数据结构的遍历操作。这些宏提供了类型安全、简洁且高效的遍历方式&#xff0c;是内核编程的核心范式之一。一、遍历宏的分类 1.1 按功能分类 Linux内核遍历宏 ├── 链…...