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

时间:2014-04-17 09:12:16

标签: c++ qt

嗨,我用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类的构造函数中写的行!!! / p>

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

由于

1 个答案:

答案 0 :(得分:0)

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

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

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