why must use Qt::DirectConnection when use moveToThread function?

21 Views Asked by At

I have three class MainWindow, BusCom and ReceiveMessageThread. MainWindow class object has a member variable of BusCom type, and BusCom class object has member variable of ReceiveMessageThread type. Creats a thread for one function of ReceiveMessageThread object by using moveToThread() function. The signal of MainWindow object cannot call immediately slot of ReceiveMessageThread object without setting Qt::DirectConnection.

connect(m_uiMainwindow->m_pbStart, &QPushButton::clicked, m_cBusCom->m_cReceiveMessageThread, &ReceiveMessageThread::receiveStartReceiveMessage,Qt::DirectConnection);

Maybe Qt uses Qt::QueueConnection. But in my understanding, if the emiter and receiver are in the same thread, Qt use Qt::DirectConnection automatically. I'm confused why Qt doesn't use Qt::DirectConnection default.

class MainWindow :public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget* parent = nullptr);
    ~MainWindow()
    {
        delete m_cBusCom;
        delete m_uiMainwindow;
    }

private:
    Ui::MainWindow* m_uiMainwindow;

    BusCom* m_cBusCom;
};

MainWindow::MainWindow(QWidget* parent)
    :QMainWindow(parent), m_uiMainwindow(new Ui::MainWindow())
{
    m_uiMainwindow->setupUi(this);

    /* BusCom class */
    m_cBusCom = new BusCom();
    connect(m_uiMainwindow->m_pbStart, &QPushButton::clicked, m_cBusCom->m_cReceiveMessageThread, &ReceiveMessageThread::receiveStartReceiveMessage);
}

class ReceiveMessageThread :public QObject
{
    Q_OBJECT
public:
    explicit ReceiveMessageThread(QObject* parent=nullptr) 
    {}

public slots:
    void receiveStartReceiveMessage();

private:
    bool m_bReceiveMessage = false;
};


class BusCom : public QObject
{
    Q_OBJECT

public:
    explicit BusCom();  
    ~BusCom()
    {
        m_tReceiveMessageThread->quit();
    }

public:
    ReceiveMessageThread* m_cReceiveMessageThread;
    QThread* m_tReceiveMessageThread;

public slots:
    void receiveCANBusType(CANBusType);
    void receiveVectorAPPInfo(HardwareConfig_CANFD);        
};

void ReceiveMessageThread::receiveStartReceiveMessage()
{
    m_bReceiveMessage = true;
}

BusCom::BusCom() :QObject(nullptr)
{
    m_cReceiveMessageThread = new ReceiveMessageThread();
    m_tReceiveMessageThread = new QThread();
    
    m_cReceiveMessageThread->moveToThread(m_tReceiveMessageThread);
    connect(m_tReceiveMessageThread, &QThread::started, m_cReceiveMessageThread, &ReceiveMessageThread::receiveMessages);
    connect(m_tReceiveMessageThread, &QThread::finished, m_cReceiveMessageThread, &QObject::deleteLater);
}
0

There are 0 best solutions below