<div id="content_views" class="htmledit_views">
<p>在qt开发中,应用程序运行中常常会因为写日志的原因,造成系统性能低下,</p>
那么这个时候就应该考虑采用单独的线程来实现日志写入功能了。
以下即为我实现的写日志代码。
1、qlog.h
- #ifndef LOG_H
- #define LOG_H
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <QDebug>
- #include <QMessageBox>
- #include <QFile>
- #include <QFileInfo>
- #include <QThread>
- #include <QList>
- #include <QSemaphore>
- #include <QMutex>
-
- class Clog : public QThread
- {
- Q_OBJECT
-
- public:
- Clog();
- void write(const QString &msg);
- virtual void run();
-
- private:
- QMutex m_mutex;
- QList<QString> m_msg;
- QSemaphore m_synSem;
- };
-
- #endif // LOG_H
2、qlog.cpp
- #include "qlog.h"
- #include <QMutex>
- #include <QFile>
- #include <QApplication>
- #include <QDate>
- #include <QDebug>
-
- Clog::Clog(): m_synSem(0)
- {
- }
-
- void Clog::write(const QString &msg)
- {
- m_mutex.lock();
-
- QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");
- QString current_date = QString("Jesus God! (%1)").arg(current_date_time);
- QString message = QString("%1 %2").arg(msg).arg(current_date);
-
- m_msg.push_back(message);
-
- m_mutex.unlock();
- m_synSem.release();
- }
-
- void Clog::run()
- {
- qDebug() << "run()";
- while (true)
- {
- m_synSem.acquire();
-
- m_mutex.lock();
-
- if (m_msg.isEmpty())
- {
- continue;
- }
-
- QString message = m_msg.front();
- m_msg.pop_front();
-
- QFile file("log.txt");
- file.open(QIODevice::WriteOnly | QIODevice::Append);
- QTextStream text_stream(&file);
- text_stream << message << "\r\n";
- file.flush();
- file.close();
- m_mutex.unlock();
- }
- }
3、main文件
-
- Clog *g_log = new Clog();
-
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
-
- g_log->start();
- g_log->write("CTK EXE start...");
-
- return a.exec();
- }
以上注意这里最关键的是:
线程中会有三个局部变量,
m_mutex、
m_msg、
m_synSem
这三个变量是核心,m_msg是其他线程写入本线程的消息队列。
m_mutex是对m_msg进行线程安全保护的互斥信号量。
m_synSem是同步信号量,当消息队列未进入时,线程处于阻塞状态,可以避免while一直死循环。
只要对这三个变量理解清楚,就算掌握了单独线程的开发之道。
</article>