From ae2b23b25598497d08c4c46fd0927db48143c875 Mon Sep 17 00:00:00 2001 From: Iakov 'Jake' Kirilenko Date: Wed, 29 Jan 2025 10:30:10 +0300 Subject: [PATCH] Prevent lock in threading calls to sensor reading --- .../robotModel/robotParts/scalarSensor.cpp | 5 +++- .../robotModel/robotParts/vectorSensor.cpp | 6 ++-- .../details/sensorVariablesUpdater.h | 4 +-- .../details/sensorVariablesUpdater.cpp | 28 +++++++++---------- 4 files changed, 23 insertions(+), 20 deletions(-) diff --git a/plugins/robots/common/kitBase/src/robotModel/robotParts/scalarSensor.cpp b/plugins/robots/common/kitBase/src/robotModel/robotParts/scalarSensor.cpp index 66dde2dd98..75b35afec8 100644 --- a/plugins/robots/common/kitBase/src/robotModel/robotParts/scalarSensor.cpp +++ b/plugins/robots/common/kitBase/src/robotModel/robotParts/scalarSensor.cpp @@ -20,7 +20,10 @@ ScalarSensor::ScalarSensor(const DeviceInfo &info, const PortInfo &port) : AbstractSensor(info, port) , mLastValue(0) { - connect(this, &ScalarSensor::newData, this, [this](const QVariant &reading) { mLastValue = reading.toInt(); }); + connect(this, &ScalarSensor::newData + , this, [this](const QVariant &reading) { mLastValue = reading.toInt(); } + , Qt::QueuedConnection + ); } int ScalarSensor::lastData() const diff --git a/plugins/robots/common/kitBase/src/robotModel/robotParts/vectorSensor.cpp b/plugins/robots/common/kitBase/src/robotModel/robotParts/vectorSensor.cpp index 3c3e72ee37..7b4a8466f5 100644 --- a/plugins/robots/common/kitBase/src/robotModel/robotParts/vectorSensor.cpp +++ b/plugins/robots/common/kitBase/src/robotModel/robotParts/vectorSensor.cpp @@ -19,8 +19,10 @@ using namespace kitBase::robotModel::robotParts; VectorSensor::VectorSensor(const DeviceInfo &info, const PortInfo &port) : AbstractSensor(info, port) { - connect(this, &VectorSensor::newData, - this, [this](const QVariant &reading) { mLastValue = reading.value>(); }); + connect(this, &VectorSensor::newData + , this, [this](const QVariant &reading) { mLastValue = reading.value>(); } + , Qt::QueuedConnection + ); } QVector VectorSensor::lastData() const diff --git a/plugins/robots/interpreters/interpreterCore/include/interpreterCore/interpreter/details/sensorVariablesUpdater.h b/plugins/robots/interpreters/interpreterCore/include/interpreterCore/interpreter/details/sensorVariablesUpdater.h index dcdd526ee2..6353439255 100644 --- a/plugins/robots/interpreters/interpreterCore/include/interpreterCore/interpreter/details/sensorVariablesUpdater.h +++ b/plugins/robots/interpreters/interpreterCore/include/interpreterCore/interpreter/details/sensorVariablesUpdater.h @@ -55,8 +55,8 @@ public slots: private slots: void onTimerTimeout(); - void onScalarSensorResponse(int reading); - void onVectorSensorResponse(const QVector &reading); + void onScalarSensorResponse(const QVariant &reading); + void onVectorSensorResponse(const QVariant &reading); void onFailure(); private: diff --git a/plugins/robots/interpreters/interpreterCore/src/interpreter/details/sensorVariablesUpdater.cpp b/plugins/robots/interpreters/interpreterCore/src/interpreter/details/sensorVariablesUpdater.cpp index 86e50c6535..c3ad448039 100644 --- a/plugins/robots/interpreters/interpreterCore/src/interpreter/details/sensorVariablesUpdater.cpp +++ b/plugins/robots/interpreters/interpreterCore/src/interpreter/details/sensorVariablesUpdater.cpp @@ -37,7 +37,9 @@ SensorVariablesUpdater::~SensorVariablesUpdater() void SensorVariablesUpdater::run() { mUpdateTimer.reset(mRobotModelManager.model().timeline().produceTimer()); - connect(mUpdateTimer.data(), &utils::AbstractTimer::timeout, this, &SensorVariablesUpdater::onTimerTimeout); + connect(mUpdateTimer.data(), &utils::AbstractTimer::timeout + ,this, &SensorVariablesUpdater::onTimerTimeout + ,Qt::QueuedConnection); resetVariables(); for (robotParts::Device * const device : mRobotModelManager.model().configuration().devices()) { @@ -49,14 +51,12 @@ void SensorVariablesUpdater::run() continue; } - using namespace std::placeholders; connect( scalarSensor , &robotParts::ScalarSensor::newData , this - , std::bind(&SensorVariablesUpdater::onScalarSensorResponse, this, - std::bind(&QVariant::value, _1)) - , Qt::UniqueConnection + , &SensorVariablesUpdater::onScalarSensorResponse + , static_cast(Qt::UniqueConnection | Qt::QueuedConnection) ); connect( @@ -64,7 +64,7 @@ void SensorVariablesUpdater::run() , &robotParts::AbstractSensor::failure , this , &SensorVariablesUpdater::onFailure - , Qt::UniqueConnection + , static_cast(Qt::UniqueConnection | Qt::QueuedConnection) ); continue; @@ -78,14 +78,12 @@ void SensorVariablesUpdater::run() continue; } - using namespace std::placeholders; connect( vectorSensor , &robotParts::VectorSensor::newData , this - , std::bind(&SensorVariablesUpdater::onVectorSensorResponse, - this, std::bind(&QVariant::value>, _1)) - , Qt::UniqueConnection + , &SensorVariablesUpdater::onVectorSensorResponse + , static_cast(Qt::UniqueConnection | Qt::QueuedConnection) ); connect( @@ -93,7 +91,7 @@ void SensorVariablesUpdater::run() , &robotParts::AbstractSensor::failure , this , &SensorVariablesUpdater::onFailure - , Qt::UniqueConnection + , static_cast(Qt::UniqueConnection | Qt::QueuedConnection) ); continue; @@ -112,7 +110,7 @@ void SensorVariablesUpdater::suspend() } } -void SensorVariablesUpdater::onScalarSensorResponse(int reading) +void SensorVariablesUpdater::onScalarSensorResponse(const QVariant &reading) { robotParts::ScalarSensor * const scalarSensor = dynamic_cast(sender()); if (!scalarSensor) { @@ -120,10 +118,10 @@ void SensorVariablesUpdater::onScalarSensorResponse(int reading) return; } - updateScalarSensorVariables(scalarSensor->port(), reading); + updateScalarSensorVariables(scalarSensor->port(), reading.toInt()); } -void SensorVariablesUpdater::onVectorSensorResponse(const QVector &reading) +void SensorVariablesUpdater::onVectorSensorResponse(const QVariant &reading) { robotParts::VectorSensor * const vectorSensor = dynamic_cast(sender()); if (!vectorSensor) { @@ -131,7 +129,7 @@ void SensorVariablesUpdater::onVectorSensorResponse(const QVector &reading) return; } - updateVectorSensorVariables(vectorSensor->port(), reading); + updateVectorSensorVariables(vectorSensor->port(), reading.value>()); } void SensorVariablesUpdater::onTimerTimeout()