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” << ”
“;
}