From 79b7e16c2963244450b485baad2038b18ca570b5 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sat, 8 Oct 2022 12:10:19 +0200 Subject: [PATCH] KiwiSDR: updated threading model. Part of #1346 --- plugins/samplesource/kiwisdr/kiwisdrinput.cpp | 32 +++++++++++++------ plugins/samplesource/kiwisdr/kiwisdrinput.h | 4 +-- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/plugins/samplesource/kiwisdr/kiwisdrinput.cpp b/plugins/samplesource/kiwisdr/kiwisdrinput.cpp index 65c1e96f2..8f3057643 100644 --- a/plugins/samplesource/kiwisdr/kiwisdrinput.cpp +++ b/plugins/samplesource/kiwisdr/kiwisdrinput.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include "SWGDeviceSettings.h" #include "SWGDeviceState.h" @@ -44,6 +45,7 @@ KiwiSDRInput::KiwiSDRInput(DeviceAPI *deviceAPI) : m_deviceAPI(deviceAPI), m_settings(), m_kiwiSDRWorker(nullptr), + m_kiwiSDRWorkerThread(nullptr), m_deviceDescription("KiwiSDR"), m_running(false), m_masterTimer(deviceAPI->getMasterTimer()) @@ -93,22 +95,28 @@ bool KiwiSDRInput::start() { QMutexLocker mutexLocker(&m_mutex); - if (m_running) stop(); + if (m_running) { + return true; + } + m_kiwiSDRWorkerThread = new QThread(); m_kiwiSDRWorker = new KiwiSDRWorker(&m_sampleFifo); - m_kiwiSDRWorker->moveToThread(&m_kiwiSDRWorkerThread); - m_kiwiSDRWorkerThread.start(); + m_kiwiSDRWorker->moveToThread(m_kiwiSDRWorkerThread); + + QObject::connect(m_kiwiSDRWorkerThread, &QThread::finished, m_kiwiSDRWorker, &QObject::deleteLater); + QObject::connect(m_kiwiSDRWorkerThread, &QThread::finished, m_kiwiSDRWorkerThread, &QThread::deleteLater); connect(this, &KiwiSDRInput::setWorkerCenterFrequency, m_kiwiSDRWorker, &KiwiSDRWorker::onCenterFrequencyChanged); connect(this, &KiwiSDRInput::setWorkerServerAddress, m_kiwiSDRWorker, &KiwiSDRWorker::onServerAddressChanged); connect(this, &KiwiSDRInput::setWorkerGain, m_kiwiSDRWorker, &KiwiSDRWorker::onGainChanged); connect(m_kiwiSDRWorker, &KiwiSDRWorker::updateStatus, this, &KiwiSDRInput::setWorkerStatus); - mutexLocker.unlock(); - - applySettings(m_settings, true); + m_kiwiSDRWorkerThread->start(); m_running = true; + mutexLocker.unlock(); + applySettings(m_settings, true); + return true; } @@ -116,14 +124,18 @@ void KiwiSDRInput::stop() { QMutexLocker mutexLocker(&m_mutex); + if (!m_running) { + return; + } + setWorkerStatus(0); - if (m_kiwiSDRWorker) + if (m_kiwiSDRWorkerThread) { - m_kiwiSDRWorkerThread.quit(); - m_kiwiSDRWorkerThread.wait(); - m_kiwiSDRWorker->deleteLater(); + m_kiwiSDRWorkerThread->quit(); + m_kiwiSDRWorkerThread->wait(); m_kiwiSDRWorker = nullptr; + m_kiwiSDRWorkerThread = nullptr; } m_running = false; diff --git a/plugins/samplesource/kiwisdr/kiwisdrinput.h b/plugins/samplesource/kiwisdr/kiwisdrinput.h index 94d324aa3..6fff5b266 100644 --- a/plugins/samplesource/kiwisdr/kiwisdrinput.h +++ b/plugins/samplesource/kiwisdr/kiwisdrinput.h @@ -22,7 +22,6 @@ #include #include #include -#include #include #include @@ -32,6 +31,7 @@ class DeviceAPI; class KiwiSDRWorker; class QNetworkAccessManager; class QNetworkReply; +class QThread; class KiwiSDRInput : public DeviceSampleSource { Q_OBJECT @@ -154,7 +154,7 @@ private: QMutex m_mutex; KiwiSDRSettings m_settings; KiwiSDRWorker* m_kiwiSDRWorker; - QThread m_kiwiSDRWorkerThread; + QThread *m_kiwiSDRWorkerThread; QString m_deviceDescription; bool m_running; const QTimer& m_masterTimer;