凡科网站建站教程,东莞规划局官方网站,网站建设网站维护网站外包,sem和seo的区别问题
在多线程场景中#xff0c;使用QSerialPort,QTcpSocket等QIODevice设备时出现报Cannot create children for a parent that is in a different thread
分析
QObject构造函数中会检查父对象的线程数据与当前对象的线程数据是否一致
static bool check_parent_thread(Q…问题
在多线程场景中使用QSerialPort,QTcpSocket等QIODevice设备时出现报Cannot create children for a parent that is in a different thread
分析
QObject构造函数中会检查父对象的线程数据与当前对象的线程数据是否一致
static bool check_parent_thread(QObject *parent,QThreadData *parentThreadData,QThreadData *currentThreadData)
{if (parent parentThreadData ! currentThreadData) {QThread *parentThread parentThreadData-thread.loadAcquire();QThread *currentThread currentThreadData-thread.loadAcquire();qWarning(QObject: Cannot create children for a parent that is in a different thread.\n(Parent is %s(%p), parents thread is %s(%p), current thread is %s(%p),parent-metaObject()-className(),parent,parentThread ? parentThread-metaObject()-className() : QThread,parentThread,currentThread ? currentThread-metaObject()-className() : QThread,currentThread);return false;}return true;
}在公有构造函数explicit QObject(QObject *parentnullptr);和保护构造函数QObject(QObjectPrivate dd, QObject *parent nullptr)
QObject::QObject(QObject *parent): d_ptr(new QObjectPrivate)
{Q_ASSERT_X(this ! parent, Q_FUNC_INFO, Cannot parent a QObject to itself);Q_D(QObject);d_ptr-q_ptr this;d-threadData (parent !parent-thread()) ? parent-d_func()-threadData : QThreadData::current();d-threadData-ref();if (parent) {QT_TRY {if (!check_parent_thread(parent, parent ? parent-d_func()-threadData : 0, d-threadData))parent 0;setParent(parent);} QT_CATCH(...) {d-threadData-deref();QT_RETHROW;}}
#if QT_VERSION 0x60000qt_addObject(this);
#endifif (Q_UNLIKELY(qtHookData[QHooks::AddQObject]))reinterpret_castQHooks::AddQObjectCallback(qtHookData[QHooks::AddQObject])(this);Q_TRACE(QObject_ctor, this);
}QObject::QObject(QObjectPrivate dd, QObject *parent): d_ptr(dd)
{Q_ASSERT_X(this ! parent, Q_FUNC_INFO, Cannot parent a QObject to itself);Q_D(QObject);d_ptr-q_ptr this;d-threadData (parent !parent-thread()) ? parent-d_func()-threadData : QThreadData::current();d-threadData-ref();if (parent) {QT_TRY {if (!check_parent_thread(parent, parent ? parent-d_func()-threadData : 0, d-threadData))parent 0;if (d-isWidget) {if (parent) {d-parent parent;d-parent-d_func()-children.append(this);}// no events sent here, this is done at the end of the QWidget constructor} else {setParent(parent);}} QT_CATCH(...) {d-threadData-deref();QT_RETHROW;}}
#if QT_VERSION 0x60000qt_addObject(this);
#endifif (Q_UNLIKELY(qtHookData[QHooks::AddQObject]))reinterpret_castQHooks::AddQObjectCallback(qtHookData[QHooks::AddQObject])(this);Q_TRACE(QObject_ctor, this);
}