diff --git a/CHANGELOG.md b/CHANGELOG.md index 69b5315e1..a8536ea34 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -79,6 +79,7 @@ - Dev: Fixed benchmarks segfaulting on run. (#5559) - Dev: Refactored `MessageBuilder` to be a single class. (#5548) - Dev: Recent changes are now shown in the nightly release description. (#5553, #5554) +- Dev: The timer for `StreamerMode` is now destroyed on the correct thread. (#5571) ## 2.5.1 diff --git a/src/singletons/StreamerMode.cpp b/src/singletons/StreamerMode.cpp index 3d8d0d2cb..67ca2d348 100644 --- a/src/singletons/StreamerMode.cpp +++ b/src/singletons/StreamerMode.cpp @@ -177,8 +177,8 @@ private: StreamerMode *parent_; pajlada::Signals::SignalHolder settingConnections_; - QTimer timer_; QThread thread_; + QTimer *timer_; std::atomic enabled_ = false; mutable std::atomic timeouts_ = 0; @@ -209,10 +209,11 @@ void StreamerMode::start() StreamerModePrivate::StreamerModePrivate(StreamerMode *parent) : parent_(parent) + , timer_(new QTimer(&this->thread_)) { this->thread_.setObjectName("StreamerMode"); - this->timer_.moveToThread(&this->thread_); - QObject::connect(&this->timer_, &QTimer::timeout, [this] { + this->timer_->moveToThread(&this->thread_); + QObject::connect(this->timer_, &QTimer::timeout, [this] { auto timeouts = this->timeouts_.fetch_add(1, std::memory_order::relaxed); if (timeouts < SKIPPED_TIMEOUTS) @@ -244,6 +245,8 @@ void StreamerModePrivate::start() StreamerModePrivate::~StreamerModePrivate() { + this->timer_->deleteLater(); + this->timer_ = nullptr; this->thread_.quit(); if (!this->thread_.wait(500)) { @@ -282,18 +285,18 @@ void StreamerModePrivate::settingChanged(StreamerModeSetting value) { case StreamerModeSetting::Disabled: { this->setEnabled(false); - this->timer_.stop(); + this->timer_->stop(); } break; case StreamerModeSetting::Enabled: { this->setEnabled(true); - this->timer_.stop(); + this->timer_->stop(); } break; case StreamerModeSetting::DetectStreamingSoftware: { - if (!this->timer_.isActive()) + if (!this->timer_->isActive()) { - this->timer_.start(20s); + this->timer_->start(20s); this->check(); } }