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

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>
posted @ 2024-07-16 14:30  mkmkbj  阅读(28)  评论(0编辑  收藏  举报