qInstallMessageHandler的学习

背景:需要做一个日志系统

把信息重定向到txt文件中。

参考: 

QT 调试信息如何输出到文件(qDebug/qWarning/qCritical/qFatal)-CSDN博客

Qt 之 qInstallMessageHandler(重定向至文件)-CSDN博客 

demo:

#include <QApplication>
#include <QMutex>
#include <QFile>
#include <QTextStream>
#include <QDebug>
static QMutex mutex;
//void myMessageHandler(QtMsgType, const QMessageLogContext &, const QString &);
void customMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{QString txt;switch (type) {case QtDebugMsg:txt="qDebug:";break;case QtInfoMsg:txt="qInfo:";break;case QtWarningMsg:txt="qWarning:";break;case QtCriticalMsg:txt="qCritical:";break;}mutex.lock();QFile file("log.txt");file.open(QIODevice::WriteOnly|QIODevice::Append);QTextStream text_stream(&file);text_stream<<txt+msg<<"\r\n";text_stream<<QString(context.file)<<"\r\n";text_stream<<QString::number(context.line)<<"\r\n";text_stream<<QString(context.function)<<"\r\n";file.close();mutex.unlock();
}int main(int argc, char *argv[])
{QApplication a(argc, argv);qInstallMessageHandler(customMessageHandler);qDebug()<<"111";qInfo()<<"222";qWarning()<<"333";qCritical()<<"444";return a.exec();
}

 关键:

 qInstallMessageHandler(customMessageHandler);

这是一个回调函数

当执行qDebug(),qInfo()......这些的时候,

会调用customMessageHandler()函数

QtMessageHandler qInstallMessageHandler(QtMessageHandler handler); 

为什么要加锁呢?

我的理解:

比如:

qDebug()<<"123"; 
qDebug()<<"456";

这两条语句都会触发customMessageHandler函数,那么可能会出现抢夺log.txt文件使用权的问题,所以要加锁

关于 context.file, context.line, context.function

文件名,文件行数,所在的函数名。 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/179268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python小技巧:探索函数调用为何加速代码执行

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Python 作为一种解释型语言&#xff0c;其执行速度相对于编译型语言可能会较慢。然而&#xff0c;在Python中&#xff0c;通常观察到代码在函数中运行得更快的现象。这个现象主要是由于函数调用的内部优化和解释…

神器!使用 patchworklib 库进行多图排版真棒啊

如果想把多个图合并放在一个图里&#xff0c;如图&#xff0c;该如何实现 好在R语言 和 Python 都有对应的解决方案&#xff0c; 分别是patchwork包和patchworklib库。 推介1 我们打造了《100个超强算法模型》&#xff0c;特点&#xff1a;从0到1轻松学习&#xff0c;原理、…

整车测试中的UDS诊断

UDS&#xff08;Unified Diagnostic Services&#xff0c;统一的诊断服务&#xff09;诊断协议是在汽车电子ECU环境下的一种诊断通信协议。这种通信协议被用在几乎所有由OEM一级供应商所制造的新ECU上面。这些ECU控制车辆的各种功能&#xff0c;包括电控燃油喷射系统&#xff0…

Week-T11-优化器对比试验

文章目录 一、准备环境二、准备数据三、搭建训练网络三、训练模型&#xff08;1&#xff09;VSCode训练情况&#xff1a;&#xff08;2&#xff09;jupyter notebook训练情况&#xff1a; 四、模型评估 & 模型预测1、绘制Accuracy-Loss图2、显示model2的预测效果 五、总结1…

域名与服务器负载均衡技术学习总结

域名与服务器负载均衡技术学习总结_域名负载均衡-CSDN博客 OSI七层网络模型和TCP/IP四层网络模型的异同_七层模型和四层模型的区别-CSDN博客

C++类与对象(7)—友元、内部类、匿名对象、拷贝对象时编译器优化

目录 一、友元 1、定义 2、友元函数 3、友元类 二、内部类 1、定义 2、特性&#xff1a; 三、匿名对象 四、拷贝对象时的一些编译器优化 1、传值&传引用返回优化对比 2、匿名对象作为函数返回对象 3、接收返回值方式对比 总结&#xff1a; 一、友元 1、定义…

RPC之grpc重试策略

1、grpc重试策略 RPC 调用失败可以分为三种情况&#xff1a; 1、RPC 请求还没有离开客户端&#xff1b; 2、RPC 请求到达服务器&#xff0c;但是服务器的应用逻辑还没有处理该请求&#xff1b; 3、服务器应用逻辑开始处理请求&#xff0c;并且处理失败&#xff1b; 最后一种…

2020年3月2日 Go生态洞察:Go协议缓冲区的新API发布

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

如何轻松将 4K 转换为 1080p 高清视频

由于某些原因&#xff0c;你可能有一些 4K 视频&#xff0c;与1080p、1080i、720p、720i等高清视频相比&#xff0c;4K 视频具有更高的分辨率&#xff0c;可以给您带来更多的视觉和听觉享受。但是&#xff0c;播放4k 视频是不太容易的&#xff0c;因为超高清电视没有高清电视那…

ubuntu重启后下无wifi,蓝牙和飞行模式切换问题

问题&#xff1a; 打开ubuntu后发现wifi没了&#xff0c;图标也找不到&#xff0c;蓝牙打不开&#xff0c;而打开飞行模式后就可以打开蓝牙了&#xff0c;关闭蓝牙就自动打开了飞行模式&#xff0c;这都是什么奇奇怪怪的问题。然后就是重装wifi驱动&#xff0c;无效。之前我也…

线性表之栈

文章目录 主要内容一.栈1.栈的初始化、判空、进栈、出栈和栈顶元素操作代码如下&#xff08;示例&#xff09;: 2.共享栈3.栈的链式存储结构 总结 主要内容 栈 一.栈 栈是一种数据结构&#xff0c;它是一种只能在一端进行插入或删除操作的线性表。栈的特点是后进先出&#xf…

C#面向对象

过程类似函数只能执行没有返回值 函数不仅能执行&#xff0c;还可以返回结果 1、面向过程 a 把完成某一需求的所有步骤 从头到尾 逐步实现 b 根据开发需求&#xff0c;将某些 功能独立 的代码 封装 成一个又一个 函数 c 最后完成的代码就是顺序的调用不同的函数 特点 1、…

torch::和at:: factory function的差別

torch::和at:: factory function的差別 前言torch::autograd::THPVariable_randtorch::rand_symintat::rand_symintdemotorch命名空間at命名空間 前言 >>> import torch >>> a torch.rand(3, 4) >>> a.requires_grad False >>> a torch…

【问题系列】消费者与MQ连接断开问题解决方案(二)

1. 问题描述 当使用RabbitMQ作为中间件&#xff0c;而消费者为服务时&#xff0c;可能会出现以下情况&#xff1a;在长时间没有消息传递后&#xff0c;消费者与RabbitMQ之间出现连接断开&#xff0c;导致无法处理新消息。解决这一问题的方法是重启Python消费者服务&#xff0c;…

C# 模拟鼠标操作工具类

写在前面 用WinForm做RPA项目时经常需要模拟鼠标操作&#xff0c;通过调用Windows Api 可以实现控制鼠标的移动、点击以及滚轮滚动&#xff0c;做到跟人工一样的操作。 代码实现 public static class MouseKeyController{[DllImport("user32")]private static exte…

【前端】js 多个并行的Promise阻塞工具 指定同时执行数量

“多线程”Promise 工具类 vue that this 或者用 全局变量 map {count:0} //阻塞并获取额度 await WTool.Thread.sleepLimit(that, 变量名称, 500) await WTool.Thread.sleepLimit(map, count, 500) Thread:{/*** 阻塞x毫秒* 使用方法* await sleep&#xff08;5000&…

大数据平台/大数据技术与原理-实验报告--部署ZooKeeper集群和实战ZooKeeper

实验名称 部署ZooKeeper集群和实战ZooKeeper 实验性质 &#xff08;必修、选修&#xff09; 必修 实验类型&#xff08;验证、设计、创新、综合&#xff09; 综合 实验课时 2 实验日期 2023.11.04-2023.11.05 实验仪器设备以及实验软硬件要求 专业实验室&#xff08…

Spring Boot 3.2.0 Tomcat虚拟线程初体验 (部分装配解析)

写在前面 spring boot 3 已经提供了对虚拟线程的支持。 虚拟线程和平台线程主要区别在于&#xff0c;虚拟线程在运行周期内不依赖操作系统线程&#xff1a;它们与硬件脱钩&#xff0c;因此被称为 “虚拟”。这种解耦是由 JVM 提供的抽象层赋予的。 虚拟线程的运行成本远低于平…

如何使用APP UI自动化测试提高测试效率与质量?

pythonappium自动化测试系列就要告一段落了&#xff0c;本篇博客咱们做个小结。 首先想要说明一下&#xff0c;APP自动化测试可能很多公司不用&#xff0c;但也是大部分自动化测试工程师、高级测试工程师岗位招聘信息上要求的&#xff0c;所以为了更好的待遇&#xff0c;我们还…