Ignore:
Timestamp:
Aug 5, 2015, 5:32:13 PM (9 years ago)
Author:
Frederik Heber <heber@…>
Branches:
Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Added_ParseSaveFragmentResults, AddingActions_SaveParseParticleParameters, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_ParticleName_to_Atom, Adding_StructOpt_integration_tests, AtomFragments, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, CombiningParticlePotentialParsing, Combining_Subpackages, Debian_Package_split, Debian_package_split_molecuildergui_only, Disabling_MemDebug, Docu_Python_wait, EmpiricalPotential_contain_HomologyGraph, EmpiricalPotential_contain_HomologyGraph_documentation, Enable_parallel_make_install, Enhance_userguide, Enhanced_StructuralOptimization, Enhanced_StructuralOptimization_continued, Example_ManyWaysToTranslateAtom, Exclude_Hydrogens_annealWithBondGraph, FitPartialCharges_GlobalError, Fix_BoundInBox_CenterInBox_MoleculeActions, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_PopActions, Fix_QtFragmentList_sorted_selection, Fix_Restrictedkeyset_FragmentMolecule, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, Fix_fitting_potentials, Fixes, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, FragmentAction_writes_AtomFragments, FragmentMolecule_checks_bonddegrees, GeometryObjects, Gui_Fixes, Gui_displays_atomic_force_velocity, ImplicitCharges, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, MoreRobust_FragmentAutomation, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PdbParser_setsAtomName, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, Rewrite_FitPartialCharges, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, SaturateAtoms_singleDegree, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, Switchable_LogView, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, TremoloParser_setsAtomName, Ubuntu_1604_changes, stable
Children:
6fe4f7
Parents:
b9e47e
git-author:
Frederik Heber <heber@…> (07/25/15 13:06:15)
git-committer:
Frederik Heber <heber@…> (08/05/15 17:32:13)
Message:

FIX: QtLogBox is again included and working thread-safe.

  • QDebugStream is now appending text to QtLogBox in a thread-safe manner by using signal/slots. This code is taken from qt-forum.de.
Location:
src/UIElements/Views/Qt4
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/UIElements/Views/Qt4/QDebugStream.hpp

    rb9e47e rec8471  
    1414#endif
    1515
    16 #include <QDebug>
    17 #include <QTextEdit>
     16#include <QObject>
     17#include <QPlainTextEdit>
    1818#include <QMutex>
    1919
    20 #include <ostream>
    21 #include <streambuf>
    22 #include <string>
     20/**
     21 * Taken from http://www.qtforum.de/forum/viewtopic.php?t=7970
     22 */
     23class QDebugStream : public QObject, std::basic_streambuf<char>{
    2324
    24 /** This class connects an output stream, such as std::cout, and a QTextEdit.
    25  *
    26  * It works by overriding certain streambuf functions such as xsputn() and
    27  * overflow().
    28  *
    29  * This code is copied from the questions posted here
    30  * http://stackoverflow.com/questions/10308425/redirect-stdcout-to-a-qtextedit
    31  * which worked right away.
    32  */
    33 class QDebugStream : public std::basic_streambuf<char>
    34 {
     25   Q_OBJECT
     26
     27signals:
     28   void sendString(QString text);
     29
    3530public:
    36   QDebugStream(std::ostream &stream, QTextEdit* text_edit) :
    37     m_stream(stream)
    38   {
    39     log_window = text_edit;
    40     m_old_buf = stream.rdbuf();
    41     stream.rdbuf(this);
    42   }
    43   ~QDebugStream()
    44   {
    45     // output anything that is left
    46     if (!m_string.empty()) {
    47       change_mutex.lock();
    48       log_window->append(m_string.c_str());
    49       qDebug() << m_string.c_str();
    50       change_mutex.unlock();
    51     }
     31   QDebugStream(std::ostream &stream, QPlainTextEdit* text_edit) : m_stream(stream){
     32      log_window = text_edit;
     33      m_old_buf = stream.rdbuf();
     34      stream.rdbuf(this);
    5235
    53     m_stream.rdbuf(m_old_buf);
    54   }
     36      connect(this, SIGNAL(sendString(QString)), text_edit, SLOT(appendPlainText (QString)));
     37   }
     38   ~QDebugStream(){
     39   // output anything that is left
     40   if (!m_string.empty())
     41      emit sendString(m_string.c_str());
     42      //log_window->appendPlainText(m_string.c_str());
     43      m_stream.rdbuf(m_old_buf);
     44   }
    5545
    5646protected:
    57   virtual int_type overflow(int_type v)
    58   {
    59     if (v == '\n') {
    60       change_mutex.lock();
    61       log_window->append(m_string.c_str());
    62       qDebug() << m_string.c_str();
    63       m_string.erase(m_string.begin(), m_string.end());
    64       change_mutex.unlock();
    65     } else
    66       m_string += v;
     47   virtual int_type overflow(int_type v){
     48      mutex.lock();
     49      if (v == '\n'){
     50         emit sendString(m_string.c_str());
     51         //log_window->appendPlainText(m_string.c_str());
     52         m_string.erase(m_string.begin(), m_string.end());
     53      }
     54      else
     55         m_string += v;
    6756
    68     return v;
    69   }
     57      mutex.unlock();
     58      return v;
     59   }
    7060
    71   virtual std::streamsize xsputn(const char *p, std::streamsize n)
    72   {
    73     change_mutex.lock();
    74     m_string.append(p, p + n);
    75     change_mutex.unlock();
     61   virtual std::streamsize xsputn(const char *p, std::streamsize n){
     62      mutex.lock();
    7663
    77     size_t pos = 0;
    78     while (pos != std::string::npos) {
    79       pos = m_string.find('\n');
    80       if (pos != std::string::npos) {
    81         std::string tmp(m_string.begin(), m_string.begin() + pos);
    82         change_mutex.lock();
    83         log_window->append(tmp.c_str());
    84         qDebug() << tmp.c_str();
    85         m_string.erase(m_string.begin(), m_string.begin() + pos + 1);
    86         change_mutex.unlock();
     64      m_string.append(p, p + n);
     65      size_t pos = 0;
     66      while (pos != std::string::npos){
     67         pos = m_string.find('\n');
     68         if (pos != std::string::npos){
     69         std::string tmp(m_string.begin(), m_string.begin() + pos);
     70         emit sendString(tmp.c_str());
     71         //log_window->appendPlainText(tmp.c_str());
     72         m_string.erase(m_string.begin(), m_string.begin() + pos + 1);
     73         }
    8774      }
    88     }
    8975
    90   return n;
    91   }
     76      mutex.unlock();
     77      return n;
     78   }
    9279
    9380private:
    94   std::ostream &m_stream;
    95   std::streambuf *m_old_buf;
    96   std::string m_string;
    97 
    98   QTextEdit* log_window;
    99 
    100   QMutex change_mutex;
     81   std::ostream &m_stream;
     82   std::streambuf *m_old_buf;
     83   std::string m_string;
     84   QPlainTextEdit* log_window;
     85   QMutex mutex;
    10186};
    10287
    103 #endif /* QDEBUGSTREAM_HPP_ */
     88
     89#endif // QDEBUGSTREAM_HPP
  • src/UIElements/Views/Qt4/QtLogBox.cpp

    rb9e47e rec8471  
    4545
    4646QtLogBox::QtLogBox(QWidget * _parent) :
    47     QTextEdit (_parent),
     47    QPlainTextEdit (_parent),
    4848    logbuf(std::cout, this)
    4949{
     
    8080
    8181  // recast event
    82   QTextEdit::mousePressEvent(e);
     82  QPlainTextEdit::mousePressEvent(e);
    8383}
    8484
  • src/UIElements/Views/Qt4/QtLogBox.hpp

    rb9e47e rec8471  
    1414#endif
    1515
    16 #include <QTextEdit>
     16#include <QPlainTextEdit>
    1717
    1818#include <string>
     
    2727 *
    2828 */
    29 class QtLogBox : public QTextEdit
     29class QtLogBox : public QPlainTextEdit
    3030{
    3131  Q_OBJECT
Note: See TracChangeset for help on using the changeset viewer.