Ignore:
Timestamp:
Aug 5, 2015, 5:32:10 PM (10 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:
e5a477
Parents:
b9680b
git-author:
Frederik Heber <heber@…> (07/19/15 06:30:51)
git-committer:
Frederik Heber <heber@…> (08/05/15 17:32:10)
Message:

QtMoleculeItem_.. now shout when they receive subjectKilled().

  • this way we do not have this double system of both QtMoleculeList (in a lazy fashion) and each QtMoleculeList listens for moleculeRemoved (one through the Observer channel, the other through subjectKilled()).
  • we simply count the number of QtMoleculeItems that received subjectKilled() and if max is reached, the row is removed.
  • to prevent molecule id clash, insertion (of same id) after removal is ok. This works cause we first remove and then insert new item. Hence, having the same id is possible.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/UIElements/Views/Qt4/MoleculeList/QtMoleculeItem.cpp

    rb9680b rcc2976  
    4848#include <algorithm>
    4949
     50#include <boost/thread/locks.hpp>
     51
    5052#include "Descriptors/MoleculeIdDescriptor.hpp"
    5153#include "molecule.hpp"
     
    5658     const channellist_t &_channellist,
    5759     const enum MoveTypes _movetype,
    58      const emitDirtyState_t _emitDirtyState) :
     60     const emitDirtyState_t _emitDirtyState,
     61     const emitSubjectKilledState_t _emitSubjectKilledState) :
    5962  Observer("QtMoleculeItem"),
    6063  molid(_molid),
     
    6366  owner(NULL),
    6467  dirty(true),
    65   emitDirtyState(_emitDirtyState)
     68  emitDirtyState(_emitDirtyState),
     69  emitSubjectKilledState(_emitSubjectKilledState)
    6670{
    6771  // BUG: We cannot sign on here as then and again we catch "pure virtual function called"
     
    7478void QtMoleculeItem::signOnToMolecule()
    7579{
     80  // count the number of threads entering the function
     81  std::cout << "QtMoleculeItem::signOnToMolecule() called for " << this << std::endl;
    7682  const molecule * const mol = const_cast<const World &>(World::getInstance()).
    7783      getMolecule(MoleculeById(molid));
    7884  if (mol != NULL) {
    79     owner = static_cast<const Observable *>(mol);
    80     for (channellist_t::const_iterator channeliter = channellist.begin();
    81         channeliter != channellist.end(); ++channeliter)
    82       owner->signOn(this, *channeliter);
     85    owner_mutex.lock();
     86    if (owner == NULL) {
     87      owner_mutex.unlock();
     88      const Observable *owner_copy = static_cast<const Observable *>(mol);
     89      for (channellist_t::const_iterator channeliter = channellist.begin();
     90          channeliter != channellist.end(); ++channeliter)
     91        owner_copy->signOn(this, *channeliter);
     92      owner_mutex.lock();
     93      owner = owner_copy;
     94      owner_mutex.unlock();
     95      std::cout << "QtMoleculeItem " << this << " has signed on to " << owner << std::endl;
     96    } else
     97      owner_mutex.unlock();
    8398  }
    8499}
     
    86101void QtMoleculeItem::signOffFromMolecule()
    87102{
    88   if (owner != NULL) {
     103  // prevent via owner that another thread enters the function again
     104  // (re-entrancy)
     105  const Observable *owner_copy = NULL;
     106  {
     107    boost::recursive_mutex::scoped_lock lock(owner_mutex);
     108    if (owner != NULL) {
     109      owner_copy = owner;
     110      owner = NULL;
     111    }
     112  }
     113  std::cout << "QtMoleculeItem::signOffFromMolecule() called for " << this << std::endl;
     114  if (owner_copy != NULL) {
    89115    for (channellist_t::const_iterator channeliter = channellist.begin();
    90116        channeliter != channellist.end(); ++channeliter)
    91       owner->signOff(this, *channeliter);
    92     owner = NULL;
     117      owner_copy->signOff(this, *channeliter);
     118    std::cout << "QtMoleculeItem " << this << " has signed off from " << owner_copy << std::endl;
    93119  }
    94120}
     
    140166  signOffFromMolecule();
    141167  dirty = false;
     168  emitSubjectKilledState(getMoleculeId());
    142169}
    143170
Note: See TracChangeset for help on using the changeset viewer.