diff --git a/source/RobotAPI/libraries/armem_gui/PeriodicUpdateWidget.cpp b/source/RobotAPI/libraries/armem_gui/PeriodicUpdateWidget.cpp
index 2e315e6f06f8e141c3911479685424b3f5585580..9fe9db837e7cfdd3ecff3c26143fcc74093d94a1 100644
--- a/source/RobotAPI/libraries/armem_gui/PeriodicUpdateWidget.cpp
+++ b/source/RobotAPI/libraries/armem_gui/PeriodicUpdateWidget.cpp
@@ -8,7 +8,6 @@
 
 #include <cmath>
 
-
 namespace armarx::armem::gui
 {
 
@@ -51,6 +50,11 @@ namespace armarx::armem::gui
 
         connect(this, &This::updateSingle, this, &This::update);
         connect(this, &This::updatePeriodic, this, &This::update);
+
+        // See `startTimerIfEnabled` for the signal reasoning.
+        // qOverload is required because `QTimer::start()` is overloaded.
+        connect(this, &This::startTimerSignal, _timer, qOverload<>(&QTimer::start));
+        connect(this, &This::stopTimerSignal, _timer, &QTimer::stop);
     }
 
     QPushButton* PeriodicUpdateWidget::updateButton()
@@ -66,22 +70,25 @@ namespace armarx::armem::gui
 
     void PeriodicUpdateWidget::startTimerIfEnabled()
     {
+        /* A QTimer can only be started and stopped within its own thread (the thread for which
+         * it has the greatest affinity). Since this method can be called from any thread, we
+         * need to take a detour through these signals, which can be emitted from any thread and
+         * will always be caught in this object's (and thus the timer's) native thread.
+         */
         if (_autoCheckBox->isChecked())
         {
-            _timer->start();
+            emit startTimerSignal();
         }
         else
         {
-            _timer->stop();
+            emit stopTimerSignal();
         }
     }
 
     void PeriodicUpdateWidget::stopTimer()
     {
-        if (_timer)
-        {
-            _timer->stop();
-        }
+        // See `startTimerIfEnabled` for the signal reasoning.
+        emit stopTimerSignal();
     }
 
     void PeriodicUpdateWidget::_updateTimerFrequency()
@@ -91,6 +98,7 @@ namespace armarx::armem::gui
 
     void PeriodicUpdateWidget::_toggleAutoUpdates(bool enabled)
     {
+        // This method is already a slot, so it doesn't need to use the timer signals.
         _frequencySpinBox->setEnabled(enabled);
         if (enabled)
         {
diff --git a/source/RobotAPI/libraries/armem_gui/PeriodicUpdateWidget.h b/source/RobotAPI/libraries/armem_gui/PeriodicUpdateWidget.h
index db8d9d5a30264180d93243c3a6f631f5666ed784..d9438993cc765f5d7b5350f28ac85dac53ed5202 100644
--- a/source/RobotAPI/libraries/armem_gui/PeriodicUpdateWidget.h
+++ b/source/RobotAPI/libraries/armem_gui/PeriodicUpdateWidget.h
@@ -50,10 +50,10 @@ namespace armarx::armem::gui
         void _updateTimerFrequency();
         void _toggleAutoUpdates(bool enabled);
 
-
     signals:
 
-
+        void startTimerSignal();
+        void stopTimerSignal();
 
     private: