Ignore:
Timestamp:
Feb 12, 2016, 11:15:04 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:
2831b3
Parents:
e25448
git-author:
Frederik Heber <heber@…> (10/16/15 11:51:16)
git-committer:
Frederik Heber <heber@…> (02/12/16 23:15:04)
Message:

FIX: All ObservedValue's of GLMoleculeObject_atom/bond/molecule wrapped into vector.

  • the idea is that a GLMoleculeObject may only remove itself _after_ each and every contained Observer has gotten the subjectKilled() signal from the Observables. Only then will destroying the Object and its members thereby not cause any signOff() which try to access Observables or their channels which are no longer present. This can be imagined as a graph where we have to start destroying object at the very bottom.
  • This is the avoid the following conflict: A superior object gets note of a molecule to be removed. It sends the visual representation a signal to remove itself, which causes it to use signOff(). On a parallel track (in another thread) we have the observed object calling subjectKilled() to inform any Observer about its immediate destruction. These two tracks collide. Now, we let first pass all subjectKilled() and when the last Observable has gotten its signal, we begin destroying the visual rep.
  • rerouted signal/slots accordingly.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.hpp

    re25448 r7c7c4a  
    1717
    1818#include <Qt3D/qgeometrydata.h>
     19
     20#include <vector>
     21#include <boost/any.hpp>
    1922
    2023#include "CodePatterns/Cacheable.hpp"
     
    6871  void AtomRemoved(const atomId_t _id);
    6972  void IdChanged();
     73  void InstanceRemoved(const moleculeId_t);
    7074
    7175private slots:
     
    141145  boost::function<atoms_t ()> PresentAtomsUpdater;
    142146
    143   //!> contains the current molecule index
    144   ObservedValue<moleculeId_t> MolIndex;
    145   //!> contains the current molecule name
    146   ObservedValue<std::string> MolName;
     147private:
     148  /** Observed Values **/
     149
     150  //!> enumeration of observed values to match with entries in ObservedValues
     151  enum ObservedTypes {
     152    //!> contains the current molecule index
     153    MolIndex,
     154    //!> contains the current molecule name
     155    MolName,
     156    //!> contains newest version of the bounding box on request
     157    BoundingBox,
     158    //!> contains the current live set of atoms for the molecule
     159    PresentAtoms,
     160    //!> gives the size of the enumeration
     161    MAX_ObservedTypes
     162  };
     163
     164  //!> vector with all observed values
     165  std::vector<boost::any> ObservedValues;
     166
     167  /** Initializes all \a ObservedValues entries.
     168   *
     169   * \param _moid molecule id
     170   */
     171  void initObservedValues(const moleculeId_t _molid);
     172
     173  /** Destroys all \a ObservedValues entries.
     174   *
     175   */
     176  void destroyObservedValues();
     177
     178  /** Getter to molecule index contained in \a ObservedValues.
     179   *
     180   * \return molecule's index
     181   */
     182  moleculeId_t getMolIndex() const;
     183
     184  /** Getter to molecule name contained in \a ObservedValues.
     185   *
     186   * \return molecule's name
     187   */
     188  std::string getMolName() const;
     189
     190  /** Getter to molecule's bounding box contained in \a ObservedValues.
     191   *
     192   * \return molecule's bounding box
     193   */
     194  molecule::BoundingBoxInfo getBoundingBox() const;
     195
     196  /** Getter to contained atoms contained in \a ObservedValues.
     197   *
     198   * \return molecule's contained atoms
     199   */
     200  atoms_t getPresentAtoms() const;
     201
     202  /** Counts how many ObservedValues got subjectKilled.
     203   *
     204   * This is used to give InstanceRemoved() signal only when each and every
     205   * ObservedValue (and the instance itself) has been subjectKilled by the
     206   * monitored Observable. Only then can we safely remove the instance.
     207   *
     208   */
     209  void countsubjectKilled();
     210
     211  //!> counts how many ObservedValues have already been subjectKilled()
     212  mutable size_t subjectKilledCount;
     213
    147214  //!> contains current version of the tesselation hull on request
    148215  Cacheable<QGeometryData> TesselationHull;
    149   //!> contains newest version of the bounding box on request
    150   ObservedValue<molecule::BoundingBoxInfo> BoundingBox;
    151   //!> contains the current live set of atoms for the molecule
    152   ObservedValue<atoms_t> PresentAtoms;
    153 
     216
     217private:
    154218  //!> contains the set of atoms displayed
    155219  atoms_t DisplayedAtoms;
Note: See TracChangeset for help on using the changeset viewer.