qt 线程中 使用QFile

1、主线程中使用QFile打开的文件,在线程中是不能写入的

2、例子入如下号好像打开和关闭都是在主线程汇中:

#include “myqthread.h”

#include “QDateTime”

#include <QCoreApplication>

#include <QDebug>

myQThread::myQThread()

{

    connect(this, SIGNAL(StartCreateThred(bool)),this, SLOT(CreateThread(bool)), Qt::QueuedConnection);

}

void myQThread::run()

{

    emit StartCreateThred(true);//这里发送的是槽函数CreateThread运行在 主线程

    QThread::sleep(30);

    m_bWrite =false;

    qDebug()<<“done”;

}

void myQThread::CreateThread( bool bStart )//槽函数

{

    qDebug()<< “CreateThread=” <<QThread::currentThread();

    if( bStart )

    {

        if( m_pThread == nullptr )

        {

            m_pThread = new QThread;

            this->moveToThread(m_pThread);

            connect(m_pThread, SIGNAL(started()),this, SLOT(SendWriteTest()) );

        }

        QString fileName = QCoreApplication::applicationDirPath();

        fileName += “/”;

        QDateTime current_date_time =QDateTime::currentDateTime();

        QString current_date =current_date_time.toString(“hh_mm_ss”);

        fileName+= current_date;

        fileName+= “.txt”;

        m_file.setFileName(fileName);

        qDebug()<<fileName;

        if( m_file.open(QIODevice::WriteOnly | QIODevice::Text))

            m_out.setDevice( &m_file);//这里进来QIODevice::write (QFile, “22_06_20.txt”): device not open

        m_pThread->start();

    }else

        m_file.close();//关闭提示

}

void myQThread::SendWriteTest()

{

    qDebug()<< “SendWriteTest=” <<QThread::currentThread();

    m_bWrite =true;

    while( m_bWrite )

    { //做了一些事情

        QThread::sleep(1);

    }

    emit StartCreateThred(false);//这里和发送的信号进出槽函数在本线程中, 所以关闭失败

}

//槽函数,主线程发送 过来写文件

void myQThread::WriteTest()//主线程发送信号 运行 SendWriteTest线程中

{

    m_out<< “aaa” << ”
“;

}

改成可正常使用如下:

#include “myqthread.h”

#include “QDateTime”

#include <QCoreApplication>

#include <QDebug>

myQThread::myQThread()

{

    connect(this, SIGNAL(StartCreateThred(bool)),this, SLOT(CreateThread(bool)), Qt::QueuedConnection);

}

myQThread::~myQThread()

{

    if( m_pFile != nullptr )

    {

        delete m_pOut;

        m_pFile->deleteLater();

    }

}

void myQThread::run()

{

    emit StartCreateThred(true);//这里发送的是主线程

    QThread::sleep(30);

    m_bWrite =false;

    qDebug()<<“done”;

}

void myQThread::CreateThread( bool bStart )

{

    qDebug()<< “CreateThread=” <<QThread::currentThread();

        if( m_pThread == nullptr )

        {

            m_pThread = new QThread;

            this->moveToThread(m_pThread);

            connect(m_pThread, SIGNAL(started()),this, SLOT(SendWriteTest()) );

        }

        m_pThread->start();

//以上这种方式创建线程,第一次可以进入槽函数SendWriteTest,后来进不去

//改为一下没有问题

 QtConcurrent::run(this, &myQThread::SendWriteTest );

}

void myQThread::SendWriteTest()

{

    qDebug()<< “SendWriteTest=” <<QThread::currentThread();

    m_bWrite =true;

    QString fileName = QCoreApplication::applicationDirPath();

    fileName += “/”;

    QDateTime current_date_time =QDateTime::currentDateTime();

    QString current_date =current_date_time.toString(“hh_mm_ss”);

    fileName+= current_date;

    fileName+= “.txt”;

    if( m_pFile == nullptr )

    {

        m_pFile =new QFile;

        m_pOut = new QTextStream;

    }

    m_pFile->setFileName(fileName);

    qDebug()<<fileName;

    if( m_pFile->open(QIODevice::WriteOnly | QIODevice::Text))

        m_pOut->setDevice( m_pFile);

    while( m_bWrite )

    { //做了一些事情

        QThread::sleep(1);

    }

    m_pFile->close();

}

void myQThread::WriteTest()//主线程发送信号 运行 SendWriteTest线程中

{

    qDebug()<< “WriteTest=”;

  (*m_pOut)<< “aaa” << ”
“;

}

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...