如何连续写入在QThread中创建的文本文件
how to write continuously into a text file created in a QThread?
嗨,我在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();
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何在qthread上创建QTCPSERVER,然后从主线程中将其停止
- 在 QT5 中,我需要创建至少 20 个 QThread
- 带有插槽和信号的QThread似乎不会创建新的线程
- QThread,在线程上创建GUI小部件元素
- 使用 Qthread-Qt5 创建新线程
- 如何创建QThread块并等待从主线程调用的函数返回值?
- 如何连续写入在QThread中创建的文本文件
- 获取创建QObject的QThread