@@ -2925,7 +2925,9 @@ void Scenario::create_hemorrhage_action(QString compartment, double ml_Per_min)
29252925 action->SetCompartment (compartment.remove (space).toStdString ());
29262926 action->GetInitialRate ().SetValue (ml_Per_min, biogears::VolumePerTimeUnit::mL_Per_min );
29272927
2928+ _engine_mutex.lock ();
29282929 _action_queue.as_source ().insert (std::move (action));
2930+ _engine_mutex.unlock ();
29292931}
29302932void Scenario::create_tourniquet_action (QString compartment, int level)
29312933{
@@ -2934,14 +2936,18 @@ void Scenario::create_tourniquet_action(QString compartment, int level)
29342936 action->SetCompartment (compartment.remove (space).toStdString ());
29352937 action->SetTourniquetLevel ((CDM::enumTourniquetApplicationLevel::value)level);
29362938
2939+ _engine_mutex.lock ();
29372940 _action_queue.as_source ().insert (std::move (action));
2941+ _engine_mutex.unlock ();
29382942}
29392943void Scenario::create_asthma_action (double severity)
29402944{
29412945 auto action = std::make_unique<biogears::SEAsthmaAttack>();
29422946 action->GetSeverity ().SetValue (severity);
29432947
2948+ _engine_mutex.lock ();
29442949 _action_queue.as_source ().insert (std::move (action));
2950+ _engine_mutex.unlock ();
29452951}
29462952void Scenario::create_substance_infusion_action (QString substance, double concentration_ug_Per_mL, double rate_mL_Per_min)
29472953{
@@ -2950,7 +2956,9 @@ void Scenario::create_substance_infusion_action(QString substance, double concen
29502956 action->GetConcentration ().SetValue (concentration_ug_Per_mL, biogears::MassPerVolumeUnit::ug_Per_mL);
29512957 action->GetRate ().SetValue (rate_mL_Per_min, biogears::VolumePerTimeUnit::mL_Per_min );
29522958
2959+ _engine_mutex.lock ();
29532960 _action_queue.as_source ().insert (std::move (action));
2961+ _engine_mutex.unlock ();
29542962
29552963 // If substance is not active, queue it for addition to physiology model (must be added to model after AdvanceTime so that substance values have been initialized)
29562964 if (!_engine->GetSubstances ().IsActive (*sub)) {
@@ -2965,7 +2973,9 @@ void Scenario::create_substance_bolus_action(QString substance, int route, doubl
29652973 action->GetDose ().SetValue (dose_mL, biogears::VolumeUnit::mL );
29662974 action->GetConcentration ().SetValue (concentration_ug_Per_mL, biogears::MassPerVolumeUnit::ug_Per_mL);
29672975
2976+ _engine_mutex.lock ();
29682977 _action_queue.as_source ().insert (std::move (action));
2978+ _engine_mutex.unlock ();
29692979
29702980 // If substance is not active, queue it for addition to physiology model (must be added to model after AdvanceTime so that substance values have been initialized)
29712981 if (!_engine->GetSubstances ().IsActive (*sub)) {
@@ -2979,7 +2989,9 @@ void Scenario::create_substance_oral_action(QString substance, int route, double
29792989 action->SetAdminRoute ((CDM::enumOralAdministration::value)route);
29802990 action->GetDose ().SetValue (dose_mg, biogears::MassUnit::mg);
29812991
2992+ _engine_mutex.lock ();
29822993 _action_queue.as_source ().insert (std::move (action));
2994+ _engine_mutex.unlock ();
29832995
29842996 // If substance is not active, queue it for addition to physiology model (must be added to model after AdvanceTime so that substance values have been initialized)
29852997 if (!_engine->GetSubstances ().IsActive (*sub)) {
@@ -2993,7 +3005,9 @@ void Scenario::create_substance_compound_infusion_action(QString compound, doubl
29933005 action->GetBagVolume ().SetValue (bagVolume_mL, biogears::VolumeUnit::mL );
29943006 action->GetRate ().SetValue (rate_mL_Per_min, biogears::VolumePerTimeUnit::mL_Per_min );
29953007
3008+ _engine_mutex.lock ();
29963009 _action_queue.as_source ().insert (std::move (action));
3010+ _engine_mutex.unlock ();
29973011
29983012 // If compound components are not active, queue them for addition to physiology model (must be added to model after AdvanceTime so that substance values have been initialized)
29993013 for (auto cmpt : subCompound->GetComponents ()) {
@@ -3009,14 +3023,18 @@ void Scenario::create_blood_transfusion_action(QString compound, double bagVolum
30093023 action->GetBagVolume ().SetValue (bagVolume_mL, biogears::VolumeUnit::mL );
30103024 action->GetRate ().SetValue (rate_mL_Per_min, biogears::VolumePerTimeUnit::mL_Per_min );
30113025
3026+ _engine_mutex.lock ();
30123027 _action_queue.as_source ().insert (std::move (action));
3028+ _engine_mutex.unlock ();
30133029}
30143030void Scenario::create_burn_action (double tbsa)
30153031{
30163032 auto action = std::make_unique<biogears::SEBurnWound>();
30173033 action->GetTotalBodySurfaceArea ().SetValue (tbsa);
30183034
3035+ _engine_mutex.lock ();
30193036 _action_queue.as_source ().insert (std::move (action));
3037+ _engine_mutex.unlock ();
30203038}
30213039void Scenario::create_infection_action (QString location, int severity, double mic_mg_Per_L)
30223040{
@@ -3025,7 +3043,9 @@ void Scenario::create_infection_action(QString location, int severity, double mi
30253043 action->SetSeverity ((CDM::enumInfectionSeverity::value)severity);
30263044 action->GetMinimumInhibitoryConcentration ().SetValue (mic_mg_Per_L, biogears::MassPerVolumeUnit::mg_Per_L);
30273045
3046+ _engine_mutex.lock ();
30283047 _action_queue.as_source ().insert (std::move (action));
3048+ _engine_mutex.unlock ();
30293049}
30303050void Scenario::create_exercise_action (int type, double weight_kg, double property_1, double property_2)
30313051{
@@ -3063,23 +3083,29 @@ void Scenario::create_exercise_action(int type, double weight_kg, double propert
30633083 break ;
30643084 }
30653085
3086+ _engine_mutex.lock ();
30663087 _action_queue.as_source ().insert (std::move (action));
3088+ _engine_mutex.unlock ();
30673089}
30683090void Scenario::create_pain_stimulus_action (double severity, QString location)
30693091{
30703092 auto action = std::make_unique<biogears::SEPainStimulus>();
30713093 action->GetSeverity ().SetValue (severity);
30723094 action->SetLocation (location.toStdString ());
30733095
3096+ _engine_mutex.lock ();
30743097 _action_queue.as_source ().insert (std::move (action));
3098+ _engine_mutex.unlock ();
30753099}
30763100void Scenario::create_traumatic_brain_injury_action (double severity, int type)
30773101{
30783102 auto action = std::make_unique<biogears::SEBrainInjury>();
30793103 action->GetSeverity ().SetValue (severity);
30803104 action->SetType ((CDM::enumBrainInjuryType::value)type);
30813105
3106+ _engine_mutex.lock ();
30823107 _action_queue.as_source ().insert (std::move (action));
3108+ _engine_mutex.unlock ();
30833109}
30843110void Scenario::create_tension_pneumothorax_action (double severity, int type, int side)
30853111{
@@ -3088,22 +3114,28 @@ void Scenario::create_tension_pneumothorax_action(double severity, int type, int
30883114 action->SetType ((CDM::enumPneumothoraxType::value)type);
30893115 action->SetSide ((CDM::enumSide::value)side);
30903116
3117+ _engine_mutex.lock ();
30913118 _action_queue.as_source ().insert (std::move (action));
3119+ _engine_mutex.unlock ();
30923120}
30933121void Scenario::create_needle_decompression_action (int state, int side)
30943122{
30953123 auto action = std::make_unique<biogears::SENeedleDecompression>();
30963124 action->SetActive ((CDM::enumOnOff::value)state);
30973125 action->SetSide ((CDM::enumSide::value)side);
30983126
3127+ _engine_mutex.lock ();
30993128 _action_queue.as_source ().insert (std::move (action));
3129+ _engine_mutex.unlock ();
31003130}
31013131void Scenario::create_cardiac_arrest_action (bool state)
31023132{
31033133 auto action = std::make_unique<biogears::SECardiacArrest>();
31043134 action->SetActive (state);
31053135
3136+ _engine_mutex.lock ();
31063137 _action_queue.as_source ().insert (std::move (action));
3138+ _engine_mutex.unlock ();
31073139}
31083140void Scenario::create_inhaler_action ()
31093141{
@@ -3140,8 +3172,11 @@ void Scenario::create_inhaler_action()
31403172 breathData->AddForcedExhale ().Load (*exhale);
31413173
31423174 // Add inhaler configuration action and breath command actions
3175+ _engine_mutex.lock ();
31433176 _action_queue.as_source ().insert (std::move (action));
31443177 _action_queue.as_source ().insert (std::move (breathData));
3178+ _engine_mutex.unlock ();
3179+
31453180 // Add albuterol to active substance queue
31463181 if (!_engine->GetSubstances ().IsActive (*albuterol)) {
31473182 _substance_queue.push_back (albuterol);
@@ -3152,35 +3187,46 @@ void Scenario::create_airway_obstruction_action(double severity)
31523187 auto action = std::make_unique<biogears::SEAirwayObstruction>();
31533188 action->GetSeverity ().SetValue (severity);
31543189
3190+ _engine_mutex.lock ();
31553191 _action_queue.as_source ().insert (std::move (action));
3192+ _engine_mutex.unlock ();
31563193}
31573194void Scenario::create_bronchoconstriction_action (double severity)
31583195{
31593196 auto action = std::make_unique<biogears::SEBronchoconstriction>();
31603197 action->GetSeverity ().SetValue (severity);
31613198
3199+ _engine_mutex.lock ();
31623200 _action_queue.as_source ().insert (std::move (action));
3201+ _engine_mutex.unlock ();
31633202}
31643203void Scenario::create_apnea_action (double severity)
31653204{
31663205 auto action = std::make_unique<biogears::SEApnea>();
31673206 action->GetSeverity ().SetValue (severity);
31683207
3208+ _engine_mutex.lock ();
31693209 _action_queue.as_source ().insert (std::move (action));
3210+ _engine_mutex.unlock ();
31703211}
31713212void Scenario::create_acute_stress_action (double severity)
31723213{
31733214 auto action = std::make_unique<biogears::SEAcuteStress>();
31743215 action->GetSeverity ().SetValue (severity);
31753216
3217+ _engine_mutex.lock ();
31763218 _action_queue.as_source ().insert (std::move (action));
3219+ _engine_mutex.unlock ();
3220+
31773221}
31783222void Scenario::create_ards_action (double severity)
31793223{
31803224 auto action = std::make_unique<biogears::SEAcuteRespiratoryDistress>();
31813225 action->GetSeverity ().SetValue (severity);
31823226
3227+ _engine_mutex.lock ();
31833228 _action_queue.as_source ().insert (std::move (action));
3229+ _engine_mutex.unlock ();
31843230}
31853231
31863232void Scenario::create_anesthesia_machine_action (int connection, int primaryGas, int source, double pMax_cmH2O, double peep_cmH2O, double reliefPressure_cmH2O, double inletFlow_L_Per_min, double respirationRate_Per_min, double ieRatio, double o2Fraction, double bottle1_mL, double bottle2_mL, QString leftSub, double leftSubFraction, QString rightSub, double rightSubFraction)
@@ -3214,7 +3260,9 @@ void Scenario::create_anesthesia_machine_action(int connection, int primaryGas,
32143260 }
32153261
32163262 if (config.GetConnection () == CDM::enumAnesthesiaMachineConnection::Tube) {
3263+ _engine_mutex.lock ();
32173264 _action_queue.as_source ().insert (std::move (intubationAction));
3265+ _engine_mutex.unlock ();
32183266 }
32193267 _action_queue.as_source ().insert (std::move (action));
32203268}
@@ -3230,7 +3278,9 @@ void Scenario::create_consume_meal_action(QString mealName, double carbs_g, doub
32303278 action->GetNutrition ().GetCalcium ().SetValue (calcium_mg, biogears::MassUnit::mg);
32313279 action->GetNutrition ().GetWater ().SetValue (water_mL, biogears::VolumeUnit::mL );
32323280
3281+ _engine_mutex.lock ();
32333282 _action_queue.as_source ().insert (std::move (action));
3283+ _engine_mutex.unlock ();
32343284}
32353285
32363286void Scenario::create_environment_action (QString enviroName, int surroundingType, double airDensity_kg_Per_m3, double airVelocity_m_Per_s, double ambientTemperature_C, double atmpshpericPressure_Pa, double clothingResistance_clo, double emissivity, double meanRadiantTemperature_C, double relativeHumidity, double respirationAmbientTemperature_C, double gasFractionO2, double gasFractionCO2, double gasFractionCO, double gasFractionN2, double concentrationSarin, double concentrationFireParticulate)
@@ -3271,7 +3321,10 @@ void Scenario::create_environment_action(QString enviroName, int surroundingType
32713321 environmentAction->GetConditions ().GetAmbientAerosol (*ambientAerosolSarin).GetConcentration ().SetValue (concentrationSarin, biogears::MassPerVolumeUnit::mg_Per_m3);
32723322 environmentAction->GetConditions ().GetAmbientAerosol (*ambientAerosolForestFireParticulate).GetConcentration ().SetValue (concentrationFireParticulate, biogears::MassPerVolumeUnit::mg_Per_m3);
32733323
3324+ _engine_mutex.lock ();
32743325 _action_queue.as_source ().insert (std::move (environmentAction));
3326+ _engine_mutex.unlock ();
3327+
32753328}
32763329
32773330QString Scenario::patient_name_and_time ()
0 commit comments