QT导出日志多线程

在Qt开发过程当中经常使用qDebug等一些输出来调试程序,但是到了正式发布的时候,都会被注释或者删除,采用日志输出来代替。

以下demo实现的功能:

  • 将调试的log信息输出到文件
  • log文件保存位置:当前程序运行的路径->debugs文件夹
  • 实时log文件为debug.log文件,当该文件大小超过20M时,按照时间重命名该文件。
  • debugs文件夹中的文件达到最大规定的数量时,删除多余的log文件。

Demo

  • logOutput.cpp

   
   
  1. #include <QDebug>
  2. #include <QMutex>
  3. class LogOutput: public QThread /*继承QThread类,使log输出另起线程,不干扰主线程*/
  4. {
  5. protected:
  6. void run(); /*复写QThread的run函数*/
  7. }; /*定义导出log的类*/
  8. void LogOutput::run(){ /*定义成员函数*/
  9. qInstallMessageHandler(customMessageHandler); /*使用Qt自带的qInstallMessageHandler函数,导出log*/
  10. }
  11. void customMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
  12. {
  13. static QMutex mutex; /*线程锁,防止多个文件同时打log时,log部分缺失*/
  14. mutex.lock();
  15. QString txt;
  16. switch (type) {
  17. //调试信息提示
  18. case QtDebugMsg:
  19. txt = QString( "Debug: %1").arg(msg);
  20. break;
  21. //一般的warning提示
  22. case QtWarningMsg:
  23. txt = QString( "Warning: %1").arg(msg);
  24. break;
  25. //严重错误提示
  26. case QtCriticalMsg:
  27. txt = QString( "Critical: %1").arg(msg);
  28. break;
  29. //致命错误提示
  30. case QtFatalMsg:
  31. txt = QString( "Fatal: %1").arg(msg);
  32. abort();
  33. }
  34. txt = QDateTime::currentDateTime().toString( "yyyy-MM-dd hh:mm:ss.zzz") + " " + txt;
  35. QString path=QCoreApplication::applicationDirPath()+ "/debugs"; /*保存log文件的路径*/
  36. QDir dir(path);
  37. if(!dir.exists()){
  38. dir.mkdir(path);
  39. }
  40. QFile outFile(path+"/debug.log");
  41. outFile.open(QIODevice::WriteOnly | QIODevice::Append);
  42. if(outFile.exists() && (outFile.size() >= 20* 1024* 1024)){
  43. QDateTime time = QDateTime::currentDateTime(); //获取系统当前时间
  44. QString str = time.toString( "yyyy-MM-dd hh-mm-ss");
  45. outFile.close();
  46. QFile::rename(path+ "/debug.log",path+ "/log" + str + ".log"); /*当前log输出文件debug.log重命名*/
  47. QFileInfoList fileList;
  48. fileList = dir.entryInfoList(QDir::Dirs|QDir::Files
  49. |QDir::Readable|QDir::Writable
  50. |QDir::Hidden|QDir::NoDotAndDotDot
  51. ,QDir::Name);
  52. int infoNum = fileList.size(); /*当前文件夹的log数量*/
  53. if(infoNum > 512){
  54. QFile fileTemp(fileList.at(0).filePath());
  55. fileTemp.remove();
  56. fileList.removeAt( 0);
  57. } //若数量达到一定值,则删除多余的log文件
  58. } else{
  59. QTextStream ts(&outFile); /*输出log到文件*/
  60. ts << txt << endl;
  61. }
  62. mutex.unlock();
  63. }

  • main.cpp中的相关使用

   
   
  1. LogOutput logOutput;
  2. logOutput.start(); /*开启log输出的线程,线程开启后,默认调用run函数*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt导出Excel通常使用QAxObject库,同时使用多线程可以提高程序的响应速度和效率。 以下是一个简单的示例代码,以导出一个包含50000个单元格的Excel表格为例: ```cpp #include <QApplication> #include <QAxObject> #include <QThread> class ExcelExporter : public QObject { Q_OBJECT public: ExcelExporter(QObject *parent = nullptr) : QObject(parent) {} public slots: void exportExcel() { QAxObject *excel = new QAxObject("Excel.Application", this); excel->setProperty("Visible", false); QAxObject *workbooks = excel->querySubObject("Workbooks"); QAxObject *workbook = workbooks->querySubObject("Add()"); QAxObject *worksheets = workbook->querySubObject("Worksheets"); QAxObject *worksheet = worksheets->querySubObject("Item(int)", 1); for (int i = 1; i <= 50000; i++) { QString cell = QString("A%1").arg(i); QAxObject *range = worksheet->querySubObject("Range(QString)", cell); range->setProperty("Value", i); delete range; } workbook->dynamicCall("SaveAs(const QString&)", "test.xlsx"); workbook->dynamicCall("Close()"); excel->dynamicCall("Quit()"); delete excel; } }; int main(int argc, char *argv[]) { QApplication a(argc, argv); ExcelExporter exporter; QThread thread; exporter.moveToThread(&thread); QObject::connect(&thread, &QThread::started, &exporter, &ExcelExporter::exportExcel); QObject::connect(&exporter, &ExcelExporter::finished, &thread, &QThread::quit); QObject::connect(&exporter, &ExcelExporter::finished, &exporter, &ExcelExporter::deleteLater); QObject::connect(&thread, &QThread::finished, &thread, &QThread::deleteLater); thread.start(); return a.exec(); } ``` 其中,`ExcelExporter`是一个QObject子类,用于导出Excel表格。`exportExcel()`是导出函数,该函数在另一个线程中运行。在`main()`函数中,我们将`ExcelExporter`移动到新线程中,并连接信号和槽以启动线程和在导出完成后关闭线程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值