首页 > 其他分享 >qt 单独线程实现日志写入功能

qt 单独线程实现日志写入功能

时间:2024-07-16 14:43:13浏览次数:12  
标签:Clog qt 线程 QString msg mutex 日志 include

https://blog.csdn.net/u012329294/article/details/88286961

            <div id="content_views" class="htmledit_views">
                <p>在qt开发中,应用程序运行中常常会因为写日志的原因,造成系统性能低下,</p> 

那么这个时候就应该考虑采用单独的线程来实现日志写入功能了。

以下即为我实现的写日志代码。

1、qlog.h

  1. #ifndef LOG_H
  2. #define LOG_H
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <QDebug>
  6. #include <QMessageBox>
  7. #include <QFile>
  8. #include <QFileInfo>
  9. #include <QThread>
  10. #include <QList>
  11. #include <QSemaphore>
  12. #include <QMutex>
  13. class Clog : public QThread
  14. {
  15. Q_OBJECT
  16. public:
  17. Clog();
  18. void write(const QString &msg);
  19. virtual void run();
  20. private:
  21. QMutex m_mutex;
  22. QList<QString> m_msg;
  23. QSemaphore m_synSem;
  24. };
  25. #endif // LOG_H

2、qlog.cpp

  1. #include "qlog.h"
  2. #include <QMutex>
  3. #include <QFile>
  4. #include <QApplication>
  5. #include <QDate>
  6. #include <QDebug>
  7. Clog::Clog(): m_synSem(0)
  8. {
  9. }
  10. void Clog::write(const QString &msg)
  11. {
  12. m_mutex.lock();
  13. QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");
  14. QString current_date = QString("Jesus God! (%1)").arg(current_date_time);
  15. QString message = QString("%1 %2").arg(msg).arg(current_date);
  16. m_msg.push_back(message);
  17. m_mutex.unlock();
  18. m_synSem.release();
  19. }
  20. void Clog::run()
  21. {
  22. qDebug() << "run()";
  23. while (true)
  24. {
  25. m_synSem.acquire();
  26. m_mutex.lock();
  27. if (m_msg.isEmpty())
  28. {
  29. continue;
  30. }
  31. QString message = m_msg.front();
  32. m_msg.pop_front();
  33. QFile file("log.txt");
  34. file.open(QIODevice::WriteOnly | QIODevice::Append);
  35. QTextStream text_stream(&file);
  36. text_stream << message << "\r\n";
  37. file.flush();
  38. file.close();
  39. m_mutex.unlock();
  40. }
  41. }

 

3、main文件

  1. Clog *g_log = new Clog();
  2. int main(int argc, char *argv[])
  3. {
  4. QApplication a(argc, argv);
  5. g_log->start();
  6. g_log->write("CTK EXE start...");
  7. return a.exec();
  8. }

以上注意这里最关键的是:

线程中会有三个局部变量,

m_mutex、
m_msg、
m_synSem

这三个变量是核心,m_msg是其他线程写入本线程的消息队列。

m_mutex是对m_msg进行线程安全保护的互斥信号量。

m_synSem是同步信号量,当消息队列未进入时,线程处于阻塞状态,可以避免while一直死循环。

只要对这三个变量理解清楚,就算掌握了单独线程的开发之道。

 

 

</article>

标签:Clog,qt,线程,QString,msg,mutex,日志,include
From: https://www.cnblogs.com/mkmkbj/p/18305171

相关文章

  • Qt各个版本安装的保姆级教程
    文章目录前言Qt简介下载Qt安装包安装Qt找到Qt的快捷方式总结前言Qt是一款跨平台的C++图形用户界面应用程序开发框架,广泛应用于桌面软件、嵌入式软件、移动应用等领域。Qt的强大之处在于其高度的模块化和丰富的工具集,可以帮助开发者快速、高效地构建出优秀的应用程序......
  • 从零开始建站---网站创建日志(1)
    很早以前突发奇想要不要搭建个网站,因为各种原因一直没有去实现,最近emo的时候发现自己行动力好差,都快大二了总该做点好玩的,所以那就开始搭一个属于自己的小网站吧                     2024/7/15搭建网站分为4步:购买域名,申请服务器,DNS解析、部署网站和备......
  • [1033] Run the batch file of the PyQt GUI, but don't show the CMD
    IbuiltaGUIlayoutusingPyQt,andIrunthePythonfilewitha.batfile.However,thismethodinitiallydisplaystheCMDwindowbeforeshowingtheprogram'smainwindow,whichlooksabitodd.TopreventorminimizetheCMDwindowfromappearing,......
  • Java中的多线程
    高并发编程的好处多线程可以给程序带来一下好处:1.充分利用CPU资源减少CPU的切换次数,减少CPU的空闲时间,从而最大程度的发挥CPU的运算能力。2.加快用户的响应时间在充分占用多的CPU运算能力的情况下,执行任务就会变得更快速,任务完成时间也就会变短,从而能加快响应时间。3.可以是......
  • Qt 打包无法定位程序输入点...
    报错原因:存在多个MGWIN,每个MGWIN的\bin\下有一个libstdc++-6.dll导致程序不知道该访问那个.dll修改方法:复制一个正确的libstdc++-6.dll到执行文件夹下(exe所在的文件夹),即可解决。一般报错解决方法:安装目录下对应编译器bin文件夹内windeployqtcmd将大部分的d......
  • Qt常用快捷键
    alt+enter//自动创建类定义的实现F1//查看帮助,文档F2//快速到变量声明Shift+F2//函数的声明和定义之间快速切换F4//在cpp和h文件切换Ctrl+M创建书签,Ctrl+.切换书签Alt+M打开书签栏。Ctrl+Enter在当前行的下方插入空白行,Ctrl+Shift+Enter......
  • 【DG】DataGuard动态性能视图及日志传输/应用服务说明
    一、DataGuard相关动态性能视图 序号 动态性能视图名称 说明1 v$database 查询打开模式,角色,保护模式,保护级别2 v$managed_standby 备库查询进程情况,RFS、MRP03 v$standby_log 查看standbyredolog4 v$archive_dest_statu......
  • QT常用函数
    #include<QFileDialog>QFileDialog::getOpenFileName()//打开一个文件,得到这个文件的绝对路径FileName=QFileDialog::getOpenFileName(this,"prd",dir.currentPath(),"prd(*.prd)");#include<QFile>QFilefile;file("文件路径")或者file.setF......
  • QT字符串QString
    QString#include<QString>追加字符QStringstr1="hello";QStringstr2="world";str1.append(str2);//str1="helloworld"str1.append("!");//str1="helloworld!......
  • 简单好用设备采集日志 1.1.0.3
    永久免费:前往Gitee最新版本更新内容Winform全部切换到.NetFramework4.0.更符合大部分的自动化设备.Web提供.NetFramework4.0的运行时环境安装包Web打开时,若当前IP为设备,直接显示设备信息介绍用途:定时全量或增量采集工控机,办公电脑文件以及日志.(SCADA,Io......