#include "threadcontroller.h"
#include "motorcontrollerclasses.h"
#include "serversocket.h"
#include <QObject>
#include <QThread>
#include <QDebug>
 
threadController
::threadController(System *systemHandler, 
QObject *parent
)    , m_systemHandler(systemHandler)
{
 
}
 
void threadController::startMotorThread() //The "spin" motor thread is an example of the infinite loop in a worker thread that is working for me.
{
    qDebug("threadController startMotorThread() called");
    stopFlag = 0;
 
    if (m_systemHandler->magnetSpinRate() > 0) {
        startSpinThread();
        emit userRequestStartSpin();
    }
 
}
 
 
void threadController::startSpinThread()
{
    qDebug("startSpinThread() called");
 
    spinQThread->setObjectName("spinThread");
    motorController *spinMotor = new motorController(*m_systemHandler);
    spinMotor->moveToThread(spinQThread);
    QObject::connect(spinMotor, 
&motorController
::destroyMotorThreadSpin, spinMotor, 
&motorController
::deleteLater);
     QObject::connect(spinMotor, 
&motorController
::destroyMotorThreadSpin, spinQThread, 
&QThread
::quit);
     QObject::connect(spinQThread, 
&QThread
::finished, spinQThread, 
&QThread
::deleteLater);
     QObject::connect(this, 
&threadController
::userRequestStartSpin, spinMotor, 
&motorController
::controlSpin);
  
    spinQThread->start();
 
}
 
void threadController::stopMotorThread() //stopFlag shuts down ALL of my motors at once - I don't want to use every time for my adjustSweep function (in motorController).
{
    stopFlag = 1;
 
    qDebug("threadController stopMotorThread() called");
 
}
 
 
void threadController::startAdjustSweepMotorThread() //the "adjustSweep" is the one I am having trouble with interrupting and destroying the thread.
{
    stopAdjustSweepFlag = 0; //stopAdjustSweepFlag is my global var. A value of 1 is supposed to interrupt the sweep. I was noodling around and am using 2 methods to try and stop it - global var and calling a method.
    startAdjustSweepThread();
    emit startAdjustSweepSignal();
 
}
 
void threadController::startAdjustSweepThread()
{
    qDebug("startAdjustSweepThread called");
 
    adjustSweepQThread->setObjectName("adjustSweepThread");
    motorController *adjustSweepMotor = new motorController(*m_systemHandler); //(m_systemHandler, this);
    adjustSweepMotor->moveToThread(adjustSweepQThread);
    QObject::connect(this, 
&threadController
::threadStopAdjustSweepSignal, adjustSweepMotor, 
&motorController
::stopAdjustSweep, Qt
::QueuedConnection); 
//This signal is successfully emitted, but the slot is never called!     QObject::connect(this, 
&threadController
::threadStopAdjustSweepSignal, adjustSweepMotor, 
&motorController
::test, Qt
::QueuedConnection); 
//Similar story to the above!     QObject::connect(adjustSweepMotor, 
&motorController
::destroyMotorThreadAdjustSweep, adjustSweepMotor, 
&motorController
::deleteLater);
     QObject::connect(adjustSweepMotor, 
&motorController
::destroyMotorThreadAdjustSweep, adjustSweepQThread, 
&QThread
::quit);
     QObject::connect(adjustSweepQThread, 
&QThread
::finished, adjustSweepQThread, 
&QThread
::deleteLater);
     QObject::connect(this, 
&threadController
::startAdjustSweepSignal, adjustSweepMotor, 
&motorController
::adjustSweep, Qt
::QueuedConnection);
  
//Below is what chatGPT told me to try, I get the signal received statement, but the invokeMethod() doesn't work and can't find the function.
//    QObject::connect(this, &threadController::threadStopAdjustSweepSignal, []() {
//        qDebug() << "Signal threadStopAdjustSweepSignal received";
//    });
    //QMetaObject::invokeMethod(adjustSweepMotor, "stopAdjustSweep", Qt::QueuedConnection);
 
    adjustSweepQThread->start();
}
        #include "threadcontroller.h"
#include "motorcontrollerclasses.h"
#include "serversocket.h"
#include <QObject>
#include <QThread>
#include <QDebug>
threadController::threadController(System *systemHandler, QObject *parent)
    : QObject{parent}
    , m_systemHandler(systemHandler)
{
}
void threadController::startMotorThread() //The "spin" motor thread is an example of the infinite loop in a worker thread that is working for me.
{
    qDebug("threadController startMotorThread() called");
    stopFlag = 0;
    if (m_systemHandler->magnetSpinRate() > 0) {
        startSpinThread();
        emit userRequestStartSpin();
    }
}
void threadController::startSpinThread()
{
    qDebug("startSpinThread() called");
    QThread *spinQThread = new QThread(); //Pointer To QThread
    spinQThread->setObjectName("spinThread");
    motorController *spinMotor = new motorController(*m_systemHandler);
    spinMotor->moveToThread(spinQThread);
    QObject::connect(spinMotor, &motorController::destroyMotorThreadSpin, spinMotor, &motorController::deleteLater);
    QObject::connect(spinMotor, &motorController::destroyMotorThreadSpin, spinQThread, &QThread::quit);
    QObject::connect(spinQThread, &QThread::finished, spinQThread, &QThread::deleteLater);
    QObject::connect(this, &threadController::userRequestStartSpin, spinMotor, &motorController::controlSpin);
    spinQThread->start();
}
void threadController::stopMotorThread() //stopFlag shuts down ALL of my motors at once - I don't want to use every time for my adjustSweep function (in motorController).
{
    stopFlag = 1;
    qDebug("threadController stopMotorThread() called");
}
void threadController::startAdjustSweepMotorThread() //the "adjustSweep" is the one I am having trouble with interrupting and destroying the thread.
{
    stopAdjustSweepFlag = 0; //stopAdjustSweepFlag is my global var. A value of 1 is supposed to interrupt the sweep. I was noodling around and am using 2 methods to try and stop it - global var and calling a method.
    startAdjustSweepThread();
    emit startAdjustSweepSignal();
}
void threadController::startAdjustSweepThread()
{
    qDebug("startAdjustSweepThread called");
    QThread *adjustSweepQThread = new QThread(); //Pointer To QThread
    adjustSweepQThread->setObjectName("adjustSweepThread");
    motorController *adjustSweepMotor = new motorController(*m_systemHandler); //(m_systemHandler, this);
    adjustSweepMotor->moveToThread(adjustSweepQThread);
    QObject::connect(this, &threadController::threadStopAdjustSweepSignal, adjustSweepMotor, &motorController::stopAdjustSweep, Qt::QueuedConnection); //This signal is successfully emitted, but the slot is never called!
    QObject::connect(this, &threadController::threadStopAdjustSweepSignal, adjustSweepMotor, &motorController::test, Qt::QueuedConnection); //Similar story to the above!
    QObject::connect(adjustSweepMotor, &motorController::destroyMotorThreadAdjustSweep, adjustSweepMotor, &motorController::deleteLater);
    QObject::connect(adjustSweepMotor, &motorController::destroyMotorThreadAdjustSweep, adjustSweepQThread, &QThread::quit);
    QObject::connect(adjustSweepQThread, &QThread::finished, adjustSweepQThread, &QThread::deleteLater);
    QObject::connect(this, &threadController::startAdjustSweepSignal, adjustSweepMotor, &motorController::adjustSweep, Qt::QueuedConnection);
//Below is what chatGPT told me to try, I get the signal received statement, but the invokeMethod() doesn't work and can't find the function.
//    QObject::connect(this, &threadController::threadStopAdjustSweepSignal, []() {
//        qDebug() << "Signal threadStopAdjustSweepSignal received";
//    });
    //QMetaObject::invokeMethod(adjustSweepMotor, "stopAdjustSweep", Qt::QueuedConnection);
    adjustSweepQThread->start();
}
To copy to clipboard, switch view to plain text mode 
  
Bookmarks