안녕하세요 저는 Qt에서 C++로 프로그램을 작성했으며 갑자기 몇 시간 동안 프로그램을 중단 한 후 그 이유를 모르겠습니다.QThread에서 만든 텍스트 파일에 연속적으로 쓰는 방법은 무엇입니까?
이유를 알아 내서 궁금해서 파일을 사용하고 내 프로그램 로그를 작성하는 데 자신감을 보였습니다. 그래서 충돌이 생기면 나는 무엇이 잘못되었는지 보아 그것을 고칠 수 있습니다. 콘솔을 사용하고 싶지 않았습니다. 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 클래스의 생성자에 쓴 줄이 있다는 것을 알게됩니다 !!!
텍스트 파일에 아무 것도 삽입되지 않는 이유는 무엇입니까? 이것은 큰 프로젝트의 일부이며이 로그 파일을 검사하여 모든 것이 잘되는지 확인하려고합니다.
감사
loggings 큰 프로그램에 큰 도움 동안은 Valgrind의 정적 분석 프로그램 (HTTP와 같은 도구가 있다는 것을 잊지 마세요 :이 블록에
변경 스레드 코드를 해결했다. wikipedia.org/wiki/List_of_tools_for_static_code_analysis#C.2FC.2B.2B). 예기치 않은 지점에서 충돌을 일으키는 버그를 예방할 수 있습니다. – stefaanv