//创建单例类
class FileWriter : public QObject
{
Q_OBJECT
public:
// 获取单例实例
static FileWriter& getInstance();
FileWriter(const FileWriter&) = delete;
FileWriter& operator=(const FileWriter&) = delete;
// 设置文件名
void setFileName(const QString& fileName);
// 设置列名
void setColumnNames(const QStringList& columnNames);
// 写入一行数据
void writeData(const QStringList& data);
private:
// 私有构造函数,确保只能通过getInstance获取实例
FileWriter(QObject* parent = nullptr);
QString m_fileName;
QStringList m_columnNames;
bool m_headerWritten;
QMutex m_mutex; // 用于确保线程安全
};
#include "filewriter.h"
#include <QFile>
#include <QTextStream>
#include <QDebug>
FileWriter::FileWriter(QObject* parent)
: QObject(parent), m_headerWritten(false)
{
}
FileWriter& FileWriter::getInstance()
{
static FileWriter instance;
return instance;
}
void FileWriter::setFileName(const QString& fileName)
{
QMutexLocker locker(&m_mutex);
m_fileName = fileName;
}
void FileWriter::setColumnNames(const QStringList& columnNames)
{
QMutexLocker locker(&m_mutex);
m_columnNames = columnNames;
m_headerWritten = false; // 重置头信息标志
}
void FileWriter::writeData(const QStringList& data)
{
QMutexLocker locker(&m_mutex); // 确保线程安全
if (m_fileName.isEmpty())
{
qWarning() << "文件名未设置";
return;
}
QFile file(m_fileName);
// 以追加模式打开文件,如果不存在则创建
if (!file.open(QIODevice::Append | QIODevice::Text))
{
qWarning() << "无法打开文件:" << m_fileName << "错误:" << file.errorString();
return;
}
QTextStream out(&file);
// 设置编码为UTF-8
out.setCodec("UTF-8");
// 如果尚未写入头信息,则先写入
if (!m_headerWritten && !m_columnNames.isEmpty())
{
out << m_columnNames.join(",") << "\n";
m_headerWritten = true;
qDebug() << "已写入列名:" << m_columnNames.join(",");
}
// 写入数据行
if (!data.isEmpty())
{
out << data.join(",") << "\n";
}
file.close();
}
//采用线程
#include "workerthread.h"
#include "filewriter.h"
#include <QDateTime>
#include <QDebug>
#include <QtGlobal>
#include "api.h"
WorkerThread::WorkerThread(QObject *parent)
{
iListCount=0;
bStart=0;
}
void WorkerThread::run()
{
while(bStart)
{
msleep(100);
if(SavePackets.size()!=0)
{
m_dataCount = SavePackets[0].size();
//for (int i = 0; i < m_dataCount; ++i)
{
//
QStringList data;
for(int j=0;j<m_dataCount;j++)
{
data << SavePackets[iListCount][j];
}
// 写入数据
FileWriter::getInstance().writeData(data);
// 模拟处理时间,
//msleep(qrand() % 100);
iListCount++;//什么时候需要清空置为0_____todo
}
}
else
{
}
}
// qDebug() << "线程" << m_threadId << "完成数据写入";
}
#ifndef WORKERTHREAD_H
#define WORKERTHREAD_H
#include <QThread>
// 工作线程类,生成数据并提交给FileWriter
class WorkerThread : public QThread
{
Q_OBJECT
public:
WorkerThread( QObject* parent = nullptr);
int iListCount;
protected:
void run() override;
public:
bool bStart;
private:
int m_threadId; // 线程ID
int m_dataCount; // 需要生成的数据数量
};
数据调用
#define STRDATETIME qPrintable (QDateTime::currentDateTime().toString("yyyy-MM-dd-HH-mm-ss"))
void MonitorEEC::initSaveData()
{
// 配置文件写入器
QString filename = QString("%1/log/Data_%2.txt").arg(QApplication::applicationDirPath()).arg(STRDATETIME);
FileWriter& writer = FileWriter::getInstance();
writer.setFileName(filename);
// 设置列名
QStringList columnNames;
columnNames << QString::fromLocal8Bit("系统时间")
<< QString::fromLocal8Bit("状态字1")
<< QString::fromLocal8Bit("状态字2" )
<< QString::fromLocal8Bit("故障字1" )
<< QString::fromLocal8Bit("故障字2")
<< QString::fromLocal8Bit("故障字3")
<< QString::fromLocal8Bit("故障字4" )
<< QString::fromLocal8Bit("故障字5" )
<< QString::fromLocal8Bit("故障字6")
<< QString::fromLocal8Bit("故障字7" )
<< QString::fromLocal8Bit("故障字8" )
<< QString::fromLocal8Bit("Ng转速")
<< QString::fromLocal8Bit("Np转速" )
<< QString::fromLocal8Bit("发动机燃气发生器后温度T45" )
<< QString::fromLocal8Bit("压气机出口压力P3")
<< QString::fromLocal8Bit("扭矩" )
<< QString::fromLocal8Bit("电动泵转速" )
<< QString::fromLocal8Bit("总距杆位置")
<< QString::fromLocal8Bit("油门杆位置PLA" )
<< QString::fromLocal8Bit("发动机进口温度T0" )
<< QString::fromLocal8Bit("大气压力P0")
<< QString::fromLocal8Bit("滑油压力Mop" )
<< QString::fromLocal8Bit("滑油温度Mot" )
<< QString::fromLocal8Bit("滑油液位")
<< QString::fromLocal8Bit("预留" )
<< QString::fromLocal8Bit("旋翼转速Nr" )
<< QString::fromLocal8Bit("燃油流量给定" )
<< QString::fromLocal8Bit("微分跟踪器Ng估计值" )
<< QString::fromLocal8Bit("离散量输入")
<< QString::fromLocal8Bit("离散量输出" )
<< QString::fromLocal8Bit("电动泵转速给定" )
<< QString::fromLocal8Bit("目标Ng转速给定")
<< QString::fromLocal8Bit("Ngc" )
<< QString::fromLocal8Bit("当前Ng转速给定" )
<< QString::fromLocal8Bit("T45预测值")
<< QString::fromLocal8Bit("预留" )
<< QString::fromLocal8Bit("Ngdot" );
writer.setColumnNames(columnNames);
}
1402

被折叠的 条评论
为什么被折叠?



