Skip to content
Snippets Groups Projects
Commit 2f0c8506 authored by Rainer Kartmann's avatar Rainer Kartmann
Browse files

Merge branch 'fix/arviz-freezing' into 'master'

ArViz: Replace Coin timer by QtTimer to fix ArViz from freezing...

See merge request ArmarX/RobotAPI!183
parents 45ead330 f1572a63
No related branches found
No related tags found
No related merge requests found
......@@ -51,11 +51,11 @@ namespace armarx::viz
return "UNKNOWN";
}
static void updateVisualizationCB(void* data, SoSensor* sensor)
{
auto* visu = static_cast<CoinVisualizer*>(data);
visu->update();
}
// static void updateVisualizationCB(void* data, SoSensor* sensor)
// {
// auto* visu = static_cast<CoinVisualizer*>(data);
// visu->update();
// }
struct TimedBlock
{
......@@ -89,10 +89,10 @@ namespace armarx::viz
&CoinVisualizerWrapper::onUpdateFailure);
root = new SoSeparator;
timerSensor = new SoTimerSensor(updateVisualizationCB, this);
//timerSensor = new SoTimerSensor(updateVisualizationCB, this);
float cycleTimeMS = 33.0f;
timerSensor->setInterval(SbTime(cycleTimeMS / 1000.0f));
//float cycleTimeMS = 33.0f;
//timerSensor->setInterval(SbTime(cycleTimeMS / 1000.0f));
}
CoinVisualizer::~CoinVisualizer()
......@@ -115,8 +115,8 @@ namespace armarx::viz
state = CoinVisualizerState::STARTING;
stateStorage = storage;
SoSensorManager* sensor_mgr = SoDB::getSensorManager();
sensor_mgr->insertTimerSensor(timerSensor);
//SoSensorManager* sensor_mgr = SoDB::getSensorManager();
//sensor_mgr->insertTimerSensor(timerSensor);
}
void CoinVisualizer::stop()
......@@ -272,6 +272,10 @@ namespace armarx::viz
void CoinVisualizer::update()
{
{
std::lock_guard lock(timingMutex);
lastTiming.updateToggle = (lastTiming.updateToggle + 1) % 10;
}
switch (state)
{
case CoinVisualizerState::STARTING:
......@@ -312,6 +316,7 @@ namespace armarx::viz
// We should restart the pull for updates so it can run in parallel
data::LayerUpdates currentUpdates = pulledUpdates;
updateResult = CoinVisualizerUpdateResult::WAITING;
timing.waitStart = time_start;
storage->begin_pullUpdatesSince(currentUpdates.revision, callback);
auto layerIDsBefore = getLayerIDs();
......@@ -343,6 +348,7 @@ namespace armarx::viz
// Copy the timing result
std::lock_guard lock(timingMutex);
timing.counter = lastTiming.counter + 1;
timing.updateToggle = lastTiming.updateToggle;
lastTiming = std::move(timing);
}
}
......@@ -350,7 +356,13 @@ namespace armarx::viz
case CoinVisualizerUpdateResult::WAITING:
{
// Still waiting for result
} break;
{
// Copy the timing result
std::lock_guard lock(timingMutex);
lastTiming.waitDuration = IceUtil::Time::now() - lastTiming.waitStart;
}
}
break;
case CoinVisualizerUpdateResult::FAILURE:
{
std::unique_lock<std::mutex> lock(stateMutex);
......
......@@ -174,6 +174,11 @@ namespace armarx::viz
IceUtil::Time layersChanged = IceUtil::Time::seconds(0);
IceUtil::Time total = IceUtil::Time::seconds(0);
IceUtil::Time waitStart = IceUtil::Time::seconds(0);
IceUtil::Time waitDuration = IceUtil::Time::seconds(0);
int updateToggle = 0;
int counter = 0;
};
......
......@@ -65,6 +65,9 @@ namespace armarx
widget.setupUi(getWidget());
updateTimer = new QTimer(this);
connect(updateTimer, &QTimer::timeout, this, QOverload<>::of(&This::onUpdate));
timingObserverTimer = new QTimer(this);
connect(timingObserverTimer, &QTimer::timeout, this, QOverload<>::of(&This::onTimingObserverUpdate));
......@@ -186,6 +189,7 @@ namespace armarx
changeMode(ArVizWidgetMode::Live);
timingObserverTimer->start(33);
updateTimer->start(33);
}
void ArVizWidgetController::onDisconnectGui()
......@@ -440,10 +444,15 @@ namespace armarx
layerTreeChanged(nullptr, 0);
}
void ArVizWidgetController::onUpdate()
{
visualizer.update();
}
void ArVizWidgetController::onTimingObserverUpdate()
{
viz::CoinVisualizer_UpdateTiming timing = visualizer.getTiming();
if (timing.counter > lastTiming.counter)
//if (timing.counter > lastTiming.counter)
{
if (debugObserver)
{
......@@ -453,6 +462,8 @@ namespace armarx
timingMap["1.2 apply, updateElements (ms)"] = new Variant(timing.applyTotal.updateElements.toMilliSecondsDouble());
timingMap["1.3 apply, removeElements (ms)"] = new Variant(timing.applyTotal.removeElements.toMilliSecondsDouble());
timingMap["2. layers (ms)"] = new Variant(timing.layersChanged.toMilliSecondsDouble());
timingMap["3. wait duration (ms)"] = new Variant(timing.waitDuration.toMilliSecondsDouble());
timingMap["4. update toggle"] = new Variant(timing.updateToggle);
timingMap["total (ms)"] = new Variant(timing.total.toMilliSecondsDouble());
timings.push_back(timing.total.toMilliSecondsDouble());
......
......@@ -140,6 +140,7 @@ namespace armarx
void showAllLayers(bool visible);
void showFilteredLayers(bool visible);
void onUpdate();
void onTimingObserverUpdate();
......@@ -174,6 +175,7 @@ namespace armarx
QPointer<SimpleConfigDialog> configDialog;
QTimer* updateTimer;
QTimer* timingObserverTimer;
viz::CoinVisualizer_UpdateTiming lastTiming;
StringVariantBaseMap timingMap;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment