如何连续写入在QThread中创建的文本文件

how to write continuously into a text file created in a QThread?

本文关键字:QThread 创建 文件 文本 何连续 连续      更新时间:2023-10-16

嗨,我在qt中用C++编写了一个程序,经过几个小时的工作,我的程序突然崩溃了,我不知道为什么。

我很想找出原因,所以我对自己说,使用一个文件,并将我的程序日志写入其中。这样,如果它崩溃了,我可以看到出了什么问题并修复它。我不想使用控制台。因为它将变成成千上万行的信息,我更喜欢将它们放在文本文件中,而不是qt控制台中。

我不能对我的调试文件使用单一的打开和关闭,因为如果我的程序突然崩溃,调试文件将没有任何信息,它将变成一个空的文本文件,所以我写了这个线程来存储我的程序多次关闭和打开的日志:

QFile *Debug_File;
QTextStream *Debug_File_Interface;
DebugClass::DebugClass(QObject *parent) :
    QThread(parent)
{
    qDebug()<<"DebugClass Thread is started .... n";
    Debug_File = new QFile("Debug_Details.txt");
    Debug_File_Interface = new QTextStream(Debug_File);
    Debug_File->open(QIODevice::WriteOnly);
    *Debug_File_Interface<<"Starting ..... "<<"n";
    Debug_File->flush();
    Debug_File->close();
}
void DebugClass::run()
{
    while(1)
    {
        for( ; Log_VEC.size()>0 ; )
        {
            Debug_File->open(QIODevice::Append);
            *Debug_File_Interface<<Log_VEC[0]<<"n";
            Debug_File->flush();
            Debug_File->close();
            QMutexLocker Locker(&LOG_VEC_MUTEX);
            Log_VEC.erase(Log_VEC.begin());
            Locker.unlock();
        }
    }
}

我在CPP文件中这样调用这个线程:

X1.cpp

X1::Function1()
{
//Process1
 ....
//End Of Process1
      QMutexLocker Log_Locker(&LOG_VEC_MUTEX);
      Log_VEC.push_back(Process1Log);
      Log_Locker.unlock();    
//Process2
 ....
//End Of Process2
      QMutexLocker Log_Locker(&LOG_VEC_MUTEX);
      Log_VEC.push_back(Process2Log);
      Log_Locker.unlock();    
}
X1::Function2()
{
//Process3
...
//end of Process3
      QMutexLocker Log_Locker(&LOG_VEC_MUTEX);
      Log_VEC.push_back(Process3Log);
      Log_Locker.unlock();    
//Process4
 ....
//End Of Process4
      QMutexLocker Log_Locker(&LOG_VEC_MUTEX);
      Log_VEC.push_back(Process4Log);
      Log_Locker.unlock();    
}

X2.cpp

X2::Function1()
{
//Process1
 ....
//End Of Process1
      QMutexLocker Log_Locker(&LOG_VEC_MUTEX);
      Log_VEC.push_back(Process1Log);
      Log_Locker.unlock();    
//Process2
 ....
//End Of Process2
      QMutexLocker Log_Locker(&LOG_VEC_MUTEX);
      Log_VEC.push_back(Process2Log);
      Log_Locker.unlock();    
}
X2::Function2()
{
//Process3
...
//end of Process3
      QMutexLocker Log_Locker(&LOG_VEC_MUTEX);
      Log_VEC.push_back(Process3Log);
      Log_Locker.unlock();    
//Process4
 ....
//End Of Process4
      QMutexLocker Log_Locker(&LOG_VEC_MUTEX);
      Log_VEC.push_back(Process4Log);
      Log_Locker.unlock();    
}

其他cpp文件也是如此。当我运行程序一分钟看看它是否有效时,我意识到文本文件中只写了一行,那就是我在Thread类的构造函数中写的那一行!!!

为什么文本文件中没有任何内容?这是一个大项目的一部分,我想通过检查这个日志文件来确保一切顺利。

感谢

由于我正在关闭每个文本文件,QTextStream类仍然连接到我在构造函数中创建的第一个对象,因此每次打开文本文件时,文本文件中都不会写入任何内容。

将线程代码更改为此块解决了问题:

    Debug_File->open(QIODevice::Append);
    Debug_File_Interface = new QTextStream(Debug_File);
    *Debug_File_Interface<<Log_VEC[0]<<"n";
    Debug_File->flush();
    Debug_File->close();