【问题标题】:how to write continuously into a text file created in a QThread?如何连续写入在 QThread 中创建的文本文件?
【发布时间】:2014-04-17 09:12: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 类的构造函数中写的那一行!!!

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

谢谢

【问题讨论】:

  • 虽然日志记录对大型程序有很大帮助,但不要忘记有 valgrind 和静态分析程序 (en.wikipedia.org/wiki/…) 等工具可以帮助防止在某些意外点导致崩溃的错误。

标签: c++ qt


【解决方案1】:

由于我正在关闭每个文本文件,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();

【讨论】:

  • 对不起,我在这挂了几个小时!!!所以我发布答案以帮助那些在不久的将来可能会陷入困境的人......
猜你喜欢
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多