我有一个正在使用的小应用程序,它需要生成一个非常详细的日志。我已经实现了一个简单的单例 Logger 类,它看起来像这样
#ifndef LOGGER_H
#define LOGGER_H
#include <QObject>
#include <QMutex>
#include <QFile>
class Logger : public QObject
{
Q_OBJECT
public:
static Logger* sharedInstance()
{
static QMutex mutex;
if (!m_sharedInstance)
{
mutex.lock();
if(!m_sharedInstance)
m_sharedInstance = new Logger;
mutex.unlock();
}
return m_sharedInstance;
}
static void dropInstance()
{
static QMutex mutex;
mutex.lock();
delete m_sharedInstance;
m_sharedInstance = 0;
mutex.unlock();
}
void setLogFilePathAndOpen(QString path);
void logMessage(QString message);
void logMessageWorker(QString message);
void closeLog();
private:
Logger() {}
Logger(const Logger &);
Logger& operator=(const Logger &);
static Logger *m_sharedInstance;
QFile m_logFile;
signals:
public slots:
};
#endif // LOGGER_H
#include <QDateTime>
#include <QtConcurrentRun>
#include "logger.h"
Logger* Logger::m_sharedInstance = 0;
void Logger::setLogFilePathAndOpen(QString path)
{
m_logFile.setFileName(path);
m_logFile.open(QIODevice::Append | QIODevice::Text);
}
void Logger::logMessage(QString message)
{
//TODO calling QtConcurrent causes about a 22% drop in performance. Look at other ways to do this.
QtConcurrent::run(this, &Logger::logMessageWorker, message);
}
void Logger::logMessageWorker(QString message)
{
QTextStream out(&m_logFile);
out << tr("%1: %2\n").arg(QDateTime::currentDateTime().toString()).arg(message);
}
void Logger::closeLog()
{
m_logFile.close();
}
现在我对 Qt 和 C++ 有点陌生,也许这都是错误的,所以对我来说放轻松:)。现在我得到了大约 22% 的性能下降,与不记录相比,使用这种方法是我能够管理的最好的方法。我想性能影响来自创建 QtConcurrent 线程。
我想我的问题是,这将是最好的方法还是有更好的方法来实现它,这将使性能更接近根本不记录。我知道无论应用程序的日志记录会变慢,但我正在尝试尽可能减少这种情况。