QT中使用一个信号量来写日志文件?

QT中使用一个信号量来写日志文件?,第1张

你的代码我是懒得看了;看了前面一点,就觉得你这写的有问题,没有充分利用QT带的功能。给毁芦派你个我的思路:

(1) 新启动一个QThread thread,该线程只运行一个事件循环(QEventLoop looploop.exec())

(2)将写日哗察志文件功能单独抽象成一个继承QObject的类LogHelp

class LogHelp :public QObject

{

Q_OBJECT

public:

void Write(QString log){emit NotifyWrite(log)}

signal:

void NotifyWrite(QString log)

public slot:

void OnWrite(QString log){/*你的核心写文件代码*/}

(3)LogHelp logHelp 对象需要 movetothread 到(1)中创建的线程;logHelp.moveToThread(&thread)

(4)重点:connect(&logHelp,SIGNAL(NotifyWrite(QString)),&logHelp,SLOT(OnWrite(QString)),Qt::QueuedConnection)

如此你就可以在其它线程中直接调用logHelp .Write(log)不用管数据安全问题。

代码手敲,可能有问题,只是告诉你个思路。这样写不用维护队列,使用的是信号和槽函数纤贺的异步队列方式。

QT存储日志用数据库还是txt文本是需要具体问题具体分析的,因为如果小量的写数据库没事。如果是大量的,肯定写文件好。汇总后写程序导入数据库。还有一种方法是写redis等内存数据库,并累积数量后触发合并写入数据库 *** 作。

并且如果这个日志是需要定期分析的,写在数据库里更方便处理;反之只是留档,就存文件里 但2种方式都要注意写 *** 作的频率。

绝对不能产生一行写一行,中间加一个内存队列来过渡,比如memcache,有新日志就加入队列,然后做个定时器去批量写入文件并清空队列,同时也规避文件冲突了。

QT存储中大端模式和小端模式是:

对于long long a 和 struct{ char ashort bint c}二者同样占据了8个字节的空间,在存储上,后者则是先存储一个char,空一个字节,然后按照大端/小端模式存储short,最后按照大端/小端模式存储int。

在我们日常使用的x86架构的计算机中(其他类别的可能会采用大端模式或可配置模式,可以通过查阅资料或者用下文的代码进行测试),都是使用的小端模式,而网络字节序是大端模式的。

这就使得在网络通启烂信时陵芦进行字节序的转换变得极为重要。比方说,通信双方规定了了通信头尺旁带为一个4字节的魔数(Magic Number),而一方按着大端序的模式发送。

一方按着小端序的模式解读,那么两方的通信就会失败。如果没有这个魔数,而在内部的数据中出现这样的问题则会更加的麻烦。

在QT中,我们经常使用 qDebug() 、 qInfo() 等来打印调试的信息,但是当打印信息过多时,很不利于查找阅读。所以本文介绍使用 QtMessageHandler 类中的 qInstallMessageHandler() 来自定义处理调试信息。

一、在主线程中注册调试信息处理回调

这里的 outputMessage 即为自定义的触发函数,当程序有调试信息时,将会调用此函数

二、实现触发函数

说明:此函数需要接受三个参数

QtMsgType type :表示调试信息类型,包括 QtDebugMsg (调试消息)、 QtInfoMsg (信息消息)、 QtWarningMsg (警告消息和可恢复的错误)、 QtCriticalMsg (关键错误和系统错误)、 QtFatalMsg (致命错误)

const QMessageLogContext &context :表示有关日志消息的其他信息,比如文件名 context.file 、行号 context.line 等等。

const QString &msg :表示原始的调试信息。

这样,我们就可以根据调试信息类型,自定义处理调试信息,并打印到日志文件等等。

但是有时候,我们会有这样的需求,有些类型如神的信息需要打印到屏幕,而有些类型的信息需要打印渣顷亏到日志。当注册了调试信息处理的回调,如何分类去处理呢?

查看QT文档中对于 qInstallMessageHandler() 的描述,可以知道该函数返回一个指向上一个消息处理程序,可以理解为上一个消息处理函数的指针。因此在使用 qInstallMessageHandler() 注册回调时,可以保存函数的返回,从而用之前的处理程序来处理调试信息

例如:

使用 s_messageHandler 来保存函数的返回值,即指向了上一个消息处理函数。在 outputMessage() 函数中使用 s_messageHandler

这样就实现了将Info等信息打印到日志,而debug信息打印到屏幕。

注: 以上写入日乎乱志文件的写法,并不是线程安全的,需要加锁来保证线程安全,这里就不再赘述。

正常的运行程序,日志内容如下:

实际项目中遇到了编译出的Release版本,日志输出没有文件信息、行数的问题。如下:

解决方法:

在.pro文件中添加宏

一定要先删除掉之前编译的中间文件,重新qmake!这样就可以在Release版本中正确输出日志信息。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12253021.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-22
下一篇 2023-05-22

发表评论

登录后才能评论

评论列表(0条)

保存