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);
}