https://blog.csdn.net/u012329294/article/details/88286961
<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>