2014-04-17 3 views
0

안녕하세요 저는 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 클래스의 생성자에 쓴 줄이 있다는 것을 알게됩니다 !!!

텍스트 파일에 아무 것도 삽입되지 않는 이유는 무엇입니까? 이것은 큰 프로젝트의 일부이며이 로그 파일을 검사하여 모든 것이 잘되는지 확인하려고합니다.

감사

+1

loggings 큰 프로그램에 큰 도움 동안은 Valgrind의 정적 분석 프로그램 (HTTP와 같은 도구가 있다는 것을 잊지 마세요 :이 블록에

변경 스레드 코드를 해결했다. wikipedia.org/wiki/List_of_tools_for_static_code_analysis#C.2FC.2B.2B). 예기치 않은 지점에서 충돌을 일으키는 버그를 예방할 수 있습니다. – stefaanv

답변

0

나는 각 텍스트 파일을 닫기있어 이후로는 QTextStream 클래스의 속삭임이 텍스트 파일에 내가 텍스트 파일을 열 때마다 기록 그래서 생성자에서 만든 첫 번째 개체에 연결된 상태로 유지. // EN :

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

미안 나는 이것을 몇 시간 동안 걸고 있었다! !! 그래서 나는 가까운 장래에 이것에 집착하는 사람들을 돕기위한 답을 게시합니다 ... – PsP

관련 문제