2017-09-06 3 views
2

ジョブの実行中に更新されるログファイルがあります。私は、テキストブラウザにテキストコンテンツを表示し、それを動的に更新する必要があります。ファイルからQTialBrowserを動的に更新する(別のジョブによって更新される)

.hファイル

public: 

    void fillloginfo(); 

    void initializeQTimer(); 

    void closeEvent(QCloseEvent *event); 

    void fillLogInfoChronically(const QString& logFilePath); 

private: 

    QTimer* m_Timer; 

    QString m_logFilePath; 

    std::ifstream m_logFileStream; 

public slots: 

    void fillLogInfoChronicallySlot(); 

.cppファイル

void logdialog::initializeQTimer(){ 

    m_Timer = NULL; 

    //create the timer object 
    m_Timer = new QTimer(this); 

    QObject::connect(m_Timer,SIGNAL(timeout()), this,SLOT(fillLogInfoChronicallySlot())); 

} 

void logdialog::closeEvent(QCloseEvent *event) 
{ 
    m_Timer->stop(); 

    if (m_logFileStream.is_open()){ 
     m_logFileStream.close(); 
    } 
} 



void logdialog::fillLogInfoChronically(const QString &logFilePath) 
{ 
    uilog->textBrowser->clear(); 

    m_LastLinePos = 0; 

    m_logFilePath = logFilePath; 

    std::string m_logFilePathStr= m_logFilePath.toStdString(); 
    m_logFileStream.open(m_logFilePathStr.c_str()); 

    if (m_logFileStream.is_open()){ 

     fillloginfo(); 

     m_Timer->start(1000); 
    } 
} 

void logdialog::fillloginfo() 
{ 
    std::string line; 
    while (getline(m_logFileStream,line)){ 
     uilog->textBrowser->append(QString::fromStdString(line)); 
    } 
} 

void logdialog::fillLogInfoChronicallySlot() 
{ 
    fillloginfo(); 
} 

だから、私は、取得するためのコールの残りの最初の呼び出しでのみファイルを読み取ることができていますファイルからの更新が機能していません。あなたが最初の読み取り後、入力ストリームでstd::ios::clear()を呼び出す必要があり、事前

+0

にありますか? – perencia

+0

私は生成されたログを制御できません。ツールからジョブを起動し、ログファイルを更新します。 –

+0

次に、ログが更新されていますか? 'getline'がブロックされているので、あなたは無期限に待つことができます。 – perencia

答えて

0

感謝。ファイル全体を読むと、ストリームにfailbitが設定され、その間にファイルが変更されていても読み込みを続行しません。あなたがもう一度読む前に行う必要がありますあなたの場合は

void logdialog::fillloginfo() 
{ 
    std::string line; 
    m_logFileStream.clear(); 
    while (getline(m_logFileStream,line)){ 
     uilog->textBrowser->append(QString::fromStdString(line)); 
    } 
} 

完全なコードは、ログが書き込まれているどのくらいの頻度で次link

+0

ありがとう、それは働いた –