diff --git a/applications/mne_scan/plugins/neuronalconnectivity/neuronalconnectivity.cpp b/applications/mne_scan/plugins/neuronalconnectivity/neuronalconnectivity.cpp index 7a7838fd0da..8ad64117590 100644 --- a/applications/mne_scan/plugins/neuronalconnectivity/neuronalconnectivity.cpp +++ b/applications/mne_scan/plugins/neuronalconnectivity/neuronalconnectivity.cpp @@ -109,7 +109,7 @@ NeuronalConnectivity::NeuronalConnectivity() NeuronalConnectivity::~NeuronalConnectivity() { - if(this->isRunning()) { + if(m_bProcessOutput) { stop(); } } @@ -195,7 +195,8 @@ void NeuronalConnectivity::unload() bool NeuronalConnectivity::start() { //Start thread - QThread::start(); + m_bProcessOutput = true; + m_OutputProcessingThread = std::thread(&NeuronalConnectivity::run, this); return true; } @@ -206,8 +207,11 @@ bool NeuronalConnectivity::stop() { m_pRtConnectivity->restart(); - requestInterruption(); - wait(500); + m_bProcessOutput = false; + + if(m_OutputProcessingThread.joinable()){ + m_OutputProcessingThread.join(); + } m_bPluginControlWidgetsInit = false; @@ -510,13 +514,13 @@ void NeuronalConnectivity::run() break; } m_mutex.unlock(); - msleep(100); + std::this_thread::sleep_for(std::chrono::milliseconds(100)); } int skip_count = 0; Network network; - while(!isInterruptionRequested()) { + while(m_bProcessOutput) { //Do processing after skip count has reached limit if((skip_count % m_iDownSample) == 0) { if(m_pCircularBuffer->pop(network)) { @@ -562,7 +566,7 @@ void NeuronalConnectivity::onMetricChanged(const QString& sMetric) m_sConnectivityMethods = QStringList() << sMetric; m_connectivitySettings.setConnectivityMethods(m_sConnectivityMethods); - if(m_pRtConnectivity && this->isRunning()) { + if(m_pRtConnectivity && m_bProcessOutput) { m_pRtConnectivity->restart(); m_pRtConnectivity->append(m_connectivitySettings); } diff --git a/applications/mne_scan/plugins/neuronalconnectivity/neuronalconnectivity.h b/applications/mne_scan/plugins/neuronalconnectivity/neuronalconnectivity.h index 4d97e087ba0..a175a1904b0 100644 --- a/applications/mne_scan/plugins/neuronalconnectivity/neuronalconnectivity.h +++ b/applications/mne_scan/plugins/neuronalconnectivity/neuronalconnectivity.h @@ -49,6 +49,8 @@ #include #include +#include + //============================================================================================================= // QT INCLUDES //============================================================================================================= @@ -272,6 +274,9 @@ class NEURONALCONNECTIVITYSHARED_EXPORT NeuronalConnectivity : public SCSHAREDLI Eigen::RowVectorXi m_vecPicks; /**< The picked data channels. */ CONNECTIVITYLIB::Network m_currentConnectivityResult; /**< The current connectivity result.*/ + + std::thread m_OutputProcessingThread; + std::atomic_bool m_bProcessOutput; }; } // NAMESPACE diff --git a/applications/mne_scan/plugins/noisereduction/noisereduction.cpp b/applications/mne_scan/plugins/noisereduction/noisereduction.cpp index e99b1a66443..026a27eac95 100644 --- a/applications/mne_scan/plugins/noisereduction/noisereduction.cpp +++ b/applications/mne_scan/plugins/noisereduction/noisereduction.cpp @@ -111,7 +111,7 @@ NoiseReduction::NoiseReduction() NoiseReduction::~NoiseReduction() { - if(this->isRunning()) { + if(m_bProcessOutput) { stop(); } } @@ -159,8 +159,11 @@ bool NoiseReduction::start() bool NoiseReduction::stop() { - requestInterruption(); - wait(500); + m_bProcessOutput = false; + + if(m_OutputProcessingThread.joinable()){ + m_OutputProcessingThread.join(); + } m_iMaxFilterTapSize = -1; @@ -224,7 +227,8 @@ void NoiseReduction::update(SCMEASLIB::Measurement::SPtr pMeasurement) if(m_iMaxFilterTapSize == -1) { m_iMaxFilterTapSize = pRTMSA->getMultiSampleArray().first().cols(); initPluginControlWidgets(); - QThread::start(); + m_bProcessOutput = true; + m_OutputProcessingThread = std::thread(&NoiseReduction::run, this); } for(unsigned char i = 0; i < pRTMSA->getMultiSampleArray().size(); ++i) { @@ -345,7 +349,7 @@ void NoiseReduction::run() MatrixXd matData; QScopedPointer pRtFilter(new RTPROCESSINGLIB::FilterOverlapAdd()); - while(!isInterruptionRequested()) { + while(m_bProcessOutput) { // Get the current data if(m_pCircularBuffer->pop(matData)) { m_mutex.lock(); @@ -409,7 +413,7 @@ void NoiseReduction::run() m_mutex.unlock(); //Send the data to the connected plugins and the display - if(!isInterruptionRequested()) { + if(m_bProcessOutput) { m_pNoiseReductionOutput->measurementData()->setValue(matData); } } diff --git a/applications/mne_scan/plugins/noisereduction/noisereduction.h b/applications/mne_scan/plugins/noisereduction/noisereduction.h index 15bc4153396..6d45e8382f0 100644 --- a/applications/mne_scan/plugins/noisereduction/noisereduction.h +++ b/applications/mne_scan/plugins/noisereduction/noisereduction.h @@ -50,6 +50,8 @@ #include +#include + //============================================================================================================= // QT INCLUDES //============================================================================================================= @@ -263,6 +265,8 @@ class NOISEREDUCTIONSHARED_EXPORT NoiseReduction : public SCSHAREDLIB::AbstractA SCSHAREDLIB::PluginInputData::SPtr m_pNoiseReductionInput; /**< The RealTimeMultiSampleArray of the NoiseReduction input.*/ SCSHAREDLIB::PluginOutputData::SPtr m_pNoiseReductionOutput; /**< The RealTimeMultiSampleArray of the NoiseReduction output.*/ + std::thread m_OutputProcessingThread; + std::atomic_bool m_bProcessOutput; signals: }; } // NAMESPACE diff --git a/applications/mne_scan/plugins/rtcmne/rtcmne.cpp b/applications/mne_scan/plugins/rtcmne/rtcmne.cpp index 4101491b538..4eb0c8ae282 100644 --- a/applications/mne_scan/plugins/rtcmne/rtcmne.cpp +++ b/applications/mne_scan/plugins/rtcmne/rtcmne.cpp @@ -115,7 +115,7 @@ RtcMne::~RtcMne() { m_future.waitForFinished(); - if(this->isRunning()) { + if(m_bProcessOutput) { stop(); } } @@ -313,7 +313,8 @@ bool RtcMne::calcFiffInfo() bool RtcMne::start() { - QThread::start(); + m_bProcessOutput = true; + m_OutputProcessingThread = std::thread(&RtcMne::run, this); return true; } @@ -321,8 +322,11 @@ bool RtcMne::start() bool RtcMne::stop() { - requestInterruption(); - wait(500); + m_bProcessOutput = false; + + if(m_OutputProcessingThread.joinable()){ + m_OutputProcessingThread.join(); + } m_qListCovChNames.clear(); m_bEvokedInput = false; @@ -369,7 +373,7 @@ void RtcMne::updateRTFS(SCMEASLIB::Measurement::SPtr pMeasurement) m_qMutex.unlock(); // update inverse operator - if(this->isRunning() && m_pRtInvOp) { + if(m_bProcessOutput && m_pRtInvOp) { m_pRtInvOp->setFwdSolution(m_pFwd); m_pRtInvOp->append(*m_pNoiseCov); } @@ -386,7 +390,7 @@ void RtcMne::updateRTMSA(SCMEASLIB::Measurement::SPtr pMeasurement) if(m_pFwd) { QSharedPointer pRTMSA = pMeasurement.dynamicCast(); - if(pRTMSA && this->isRunning()) { + if(pRTMSA && m_bProcessOutput) { //Fiff Information of the RTMSA m_qMutex.lock(); if(!m_pFiffInfoInput) { @@ -400,7 +404,7 @@ void RtcMne::updateRTMSA(SCMEASLIB::Measurement::SPtr pMeasurement) initPluginControlWidgets(); } - if(this->isRunning()) { + if(m_bProcessOutput) { // Check for artifacts QMap mapReject; mapReject.insert("eog", 150e-06); @@ -433,7 +437,7 @@ void RtcMne::updateRTC(SCMEASLIB::Measurement::SPtr pMeasurement) if(m_pFwd) { QSharedPointer pRTC = pMeasurement.dynamicCast(); - if(pRTC && this->isRunning()) { + if(pRTC && m_bProcessOutput) { // Init Real-Time inverse estimator if(!m_pRtInvOp && m_pFiffInfo && m_pFwd) { m_pRtInvOp = RtInvOp::SPtr(new RtInvOp(m_pFiffInfo, m_pFwd)); @@ -446,7 +450,7 @@ void RtcMne::updateRTC(SCMEASLIB::Measurement::SPtr pMeasurement) m_qListCovChNames = pRTC->getValue()->names; } - if(this->isRunning() && m_pRtInvOp){ + if(m_bProcessOutput && m_pRtInvOp){ m_pNoiseCov = pRTC->getValue(); m_pRtInvOp->append(*m_pNoiseCov); } @@ -467,7 +471,7 @@ void RtcMne::updateRTE(SCMEASLIB::Measurement::SPtr pMeasurement) initPluginControlWidgets(); } - if(!this->isRunning() || !lResponsibleTriggerTypes.contains(m_sAvrType)) { + if(!m_bProcessOutput || !lResponsibleTriggerTypes.contains(m_sAvrType)) { return; } @@ -491,7 +495,7 @@ void RtcMne::updateRTE(SCMEASLIB::Measurement::SPtr pMeasurement) initPluginControlWidgets(); } - if(this->isRunning()) { + if(m_bProcessOutput) { for(int i = 0; i < pFiffEvokedSet->evoked.size(); ++i) { if(pFiffEvokedSet->evoked.at(i).comment == m_sAvrType) { // Store current evoked as member so we can dispatch it if the time pick by the user changed @@ -551,7 +555,7 @@ void RtcMne::onTimePointValueChanged(int iTimePointMs) m_iTimePointSps = m_pFiffInfoInput->sfreq * (float)iTimePointMs * 0.001f; m_qMutex.unlock(); - if(this->isRunning()) { + if(m_bProcessOutput) { while(!m_pCircularEvokedBuffer->push(m_currentEvoked)) { //Do nothing until the circular buffer is ready to accept new data again } @@ -565,7 +569,7 @@ void RtcMne::run() { // Wait for fiff info to arrive while(!calcFiffInfo()) { - msleep(200); + std::this_thread::sleep_for(std::chrono::milliseconds(200)); } // Init parameters @@ -588,7 +592,7 @@ void RtcMne::run() QStringList lChNamesInvOp; // Start processing data - while(!isInterruptionRequested()) { + while(m_bProcessOutput) { m_qMutex.lock(); iTimePointSps = m_iTimePointSps; bEvokedInput = m_bEvokedInput; diff --git a/applications/mne_scan/plugins/rtcmne/rtcmne.h b/applications/mne_scan/plugins/rtcmne/rtcmne.h index 83c36037120..fa3c2cf0faf 100644 --- a/applications/mne_scan/plugins/rtcmne/rtcmne.h +++ b/applications/mne_scan/plugins/rtcmne/rtcmne.h @@ -50,6 +50,8 @@ #include +#include + //============================================================================================================= // QT INCLUDES //============================================================================================================= @@ -265,6 +267,9 @@ class RTCMNESHARED_EXPORT RtcMne : public SCSHAREDLIB::AbstractAlgorithm MNELIB::MNEInverseOperator m_invOp; /**< The inverse operator. */ + std::thread m_OutputProcessingThread; + std::atomic_bool m_bProcessOutput; + signals: void responsibleTriggerTypesChanged(const QStringList& lResponsibleTriggerTypes); diff --git a/applications/mne_scan/plugins/rtfwd/rtfwd.cpp b/applications/mne_scan/plugins/rtfwd/rtfwd.cpp index b4384cc3841..711784b8f8e 100644 --- a/applications/mne_scan/plugins/rtfwd/rtfwd.cpp +++ b/applications/mne_scan/plugins/rtfwd/rtfwd.cpp @@ -115,7 +115,7 @@ RtFwd::~RtFwd() { m_future.waitForFinished(); - if(this->isRunning()) { + if(m_bProcessOutput) { stop(); } } @@ -222,7 +222,8 @@ bool RtFwd::start() stream->close(); //Start thread - QThread::start(); + m_bProcessOutput = true; + m_OutputProcessingThread = std::thread(&RtFwd::run, this); return true; } @@ -231,8 +232,11 @@ bool RtFwd::start() bool RtFwd::stop() { - requestInterruption(); - wait(500); + m_bProcessOutput = false; + + if(m_OutputProcessingThread.joinable()){ + m_OutputProcessingThread.join(); + } m_bPluginControlWidgetsInit = false; @@ -400,7 +404,7 @@ void RtFwd::run() break; } m_mutex.unlock(); - msleep(200); + std::this_thread::sleep_for(std::chrono::milliseconds(200)); } m_mutex.lock(); @@ -429,7 +433,7 @@ void RtFwd::run() bool bDoFwdComputation = false; // compute forward if requested bool bIsInit = false; // only recompute if initial fwd solulion is calculated - while(!isInterruptionRequested()) { + while(m_bProcessOutput) { m_mutex.lock(); bDoFwdComputation = m_bDoFwdComputation; m_mutex.unlock(); diff --git a/applications/mne_scan/plugins/rtfwd/rtfwd.h b/applications/mne_scan/plugins/rtfwd/rtfwd.h index 29078297177..ef7af2c3dbf 100644 --- a/applications/mne_scan/plugins/rtfwd/rtfwd.h +++ b/applications/mne_scan/plugins/rtfwd/rtfwd.h @@ -49,6 +49,8 @@ #include +#include + //============================================================================================================= // QT INCLUDES //============================================================================================================= @@ -225,6 +227,9 @@ class RTFWDSHARED_EXPORT RtFwd : public SCSHAREDLIB::AbstractAlgorithm SCSHAREDLIB::PluginOutputData::SPtr m_pRTFSOutput; /**< The fwd solution.*/ + std::thread m_OutputProcessingThread; + std::atomic_bool m_bProcessOutput; + signals: //========================================================================================================= /** diff --git a/applications/mne_scan/plugins/writetofile/writetofile.cpp b/applications/mne_scan/plugins/writetofile/writetofile.cpp index 3b8f7f72b60..1ef213112c8 100644 --- a/applications/mne_scan/plugins/writetofile/writetofile.cpp +++ b/applications/mne_scan/plugins/writetofile/writetofile.cpp @@ -111,7 +111,7 @@ WriteToFile::WriteToFile() WriteToFile::~WriteToFile() { - if(this->isRunning()) { + if(m_bProcessOutput) { stop(); } } @@ -145,7 +145,8 @@ void WriteToFile::unload() bool WriteToFile::start() { - QThread::start(); + m_bProcessOutput = true; + m_OutputProcessingThread = std::thread(&WriteToFile::run, this); return true; } @@ -154,8 +155,11 @@ bool WriteToFile::start() bool WriteToFile::stop() { - requestInterruption(); - wait(); + m_bProcessOutput = false; + + if(m_OutputProcessingThread.joinable()){ + m_OutputProcessingThread.join(); + } m_bPluginControlWidgetsInit = false; @@ -293,7 +297,7 @@ void WriteToFile::run() MatrixXd matData; qint32 size = 0; - while(!isInterruptionRequested()) { + while(m_bProcessOutput) { if(m_pCircularBuffer) { //pop matrix diff --git a/applications/mne_scan/plugins/writetofile/writetofile.h b/applications/mne_scan/plugins/writetofile/writetofile.h index 1530c89d7b7..e849fe28230 100644 --- a/applications/mne_scan/plugins/writetofile/writetofile.h +++ b/applications/mne_scan/plugins/writetofile/writetofile.h @@ -46,6 +46,8 @@ #include #include +#include + //============================================================================================================= // QT INCLUDES //============================================================================================================= @@ -310,6 +312,9 @@ class WRITETOFILESHARED_EXPORT WriteToFile : public SCSHAREDLIB::AbstractAlgorit FIFFLIB::FiffFileSharer m_FileSharer; /**< Handles copying recording file and saving copy to shared directory. */ QStringList m_lFileNames; /**< List of file names of latest recording */ + + std::thread m_OutputProcessingThread; + std::atomic_bool m_bProcessOutput; }; } // NAMESPACE