this->moveToThread(thread);
编译时程序输出:
QObject: Cannot create children for a parent that is in a different thread.
(Parent is SerialPort(0x6c48140), parent's thread is QThread(0x6c4a338), current thread is QThread(0x219e750)
以如下代码为例:
cpp
SerialPort::SerialPort()
: m_thread(nullptr)
, m_port(nullptr)
{
//! 1
//正确的,不输出警告信息的
init_serialport();
tts = new QTextToSpeech(this);
init_thread();
//! 2
//错误的。输出如上述信息的
//init_serialport();
//init_thread();
//tts = new QTextToSpeech(this); //tts在SerialPort父类线程中创建
//! 3
//错误的。输出如上述信息的
//tts = new QTextToSpeech(this);
//init_thread();
//init_serialport(); //m_port在SerialPort父类线程中创建
//! 4
//错误的。输出如上述信息的
//init_thread();
//tts = new QTextToSpeech(this); //tts在SerialPort父类线程中创建
//init_serialport(); //m_port在SerialPort父类线程中创建
}
void SerialPort::init_thread()
{
m_thread = new QThread;
m_thread->setObjectName("串口线程");
this->moveToThread(m_thread);
connect(m_thread, &QThread::finished, this, &QThread::deleteLater);
connect(m_thread, &QThread::finished, this, &SerialPort::deleteLater);
m_thread->start();
}
void SerialPort::init_serialport()
{
m_port = new QSerialPort();
}
总结:
- 在构造函数中定义的对象是在定义该类的线程中的
- 在将本类moveToThread后声明的对象不在子线程创建,而是仍在其类被声明所在线程(就会报上述警告信息)