多线程+单例-读写txt

//创建单例类

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);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值