QThread报错: Cannot create children for a parent that is
2018-02-09 11:12
471 查看
在线程类(继承QThread)里面用了一个QTimer,并有一个对应的slot函数。运行的过程中会报错:QObject:Cannot create children for a parent that is in a differentthread.(Parent ismyThread(0x98f6e10), parent's thread is QThread(0x98d08a0), currentthread is myThread(0x98f6e10)为什么呢?因为QThread的对象依附在主线程中,所以他的slot函数会在主线程中执行,而不是次线程。除非:QThread对象依附到次线程中(通过movetoThread)slot和信号是直接连接,且信号在次线程中发射然后通过查找资料,可以得到:如果没有对qthread中run()函数进行重载,那么run()的动作就是简单的exec(),当调用start()之后,qthread进入它的事件循环当中去,run()函数便是事件循环的起始点。常见的事件循环的表现形式为在run()里面写一个死循环,例如:run(){while(1) {you_do_something_here();}}但有时候我们希望能有一个时钟作为事件驱动,这个时候我们引入qtimer,因此不再重载run(),同时因为qthread对象是存在于创建它的线程当中的,为了能让qtimer真正驱动qthread中的某个函数,我们需要调用moveToThread()这个函数,把qthread对象移动到它自己对应的线程当中去。参考:http://fateboat.72pines.com/2009/12/24/qthread中使用qtimer/最后我把run函数注释掉不去重载它,把timer初始化放到Myhread的构造函数里面,运行通过,没有报错。我在MyThread的构造函数里面添加了一句: qDebug() << "timer: " << timer->thread();输出结果为: timer: QThread(0x8b98388)恩,明白了,如果不重载QThread的run函数,那么子线程类(MyThread)构造函数new的对象和slot都在主线程中运行。但如果是这样子的话?那还算多线程吗?第二种方法:在run中发个信号到主线程中槽函数,由于你的槽函数是在主线程中运行,就不会出现这种现象了(没有尝试,感觉体现不了多线程的东西)第三种方法:其实,这个方法太简单,太好用了。定义一个普通的QObject派生类,然后将其对象move到QThread中。使用信号和槽时根本不用考虑多线程的存在。也不用使用QMutex来进行同步,Qt的事件循环会自己自动处理好这个。(这种方法来自http://hi.baidu.com/cyclone/blog/item/a33794ee00acba262cf53442.html#0)
#include <</SPAN>QtCore/QCoreApplication> #include <</SPAN>QtCore/QObject> #include <</SPAN>QtCore/QThread> #include <</SPAN>QtCore/QDebug> class Dummy:public QObject { Q_OBJECT public: Dummy(QObject* parent=0):QObject(parent) {} public slots: void emitsig() { emit sig(); } signals: void sig(); }; class Object:public QObject { Q_OBJECT public: Object(){} public slots: void slot() { qDebug()<<"from thread slot:" <<QThread::currentThreadId(); } }; #include "main.moc" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qDebug()<<"main thread:"<<QThread::currentThreadId(); QThread thread; Object obj; Dummy dummy; obj.moveToThread(&thread); QObject::connect(&dummy, SIGNAL(sig()), &obj, SLOT(slot())); thread.start(); dummy.emitsig(); return a.exec(); }结果:恩,slot确实不在主线程中运行(这么简单不值得欢呼么?)
main thread: 0x1a5cfrom thread slot: 0x186c感觉前2种方法有点取巧,第3种貌似体现了多线程,但是好像又不太好(PS:对多线程理解有限,待提高)个人的问题是:1.个人感觉不重载run函数,都体现不了多线程的东西;2.如果有程序必须重载run函数,再遇到这个问题如何解决?3.如果时间要求精确,不可以用QTimer呢?那用什么代替呢?这些都是要面对并必须解决的问题。PS:如果在run里面使用了 timer->start();就必须在run函数的最后面添加 exec();以使线程可以处理循环eventmark一下。继续研究~
相关文章推荐
- QThread报错: Cannot create children for a parent that is
- QObject: Cannot create children for a parent that is in a different thread.
- Qt里出现 Cannot create children for a parent that is in a different thread
- QObject: Cannot create children for a parent that is in a different thread.
- Qt中次线程里创建对象,出现Cannot create children for a parent that is in a different thread
- QT出现 Cannot create children for a parent that is in a different thread 的解决方法:
- QObject: Cannot create children for a parent that is in a different thread
- Qt出现QObject: Cannot create children for a parent that is in a different thread.问题
- Qt中次线程里创建对象,出现Cannot create children for a parent that is in a different thread
- Cannot create children for a parent that is in a different thread
- QObject: Cannot create children for a parent that is in a different thread
- QThread报错: Cannot create children for a parent that is
- 【Qt】Qt出现QObject: Cannot create children for a parent that is in a different thread.问题
- QT线程出现错误Cannot create children for a parent that is in a different thread
- qt#5 QObject: Cannot create children for a parent that is in a different thread.
- ORA-65179: cannot keep datafiles for a pluggable database that is not unplugged
- [SAP HANA]Cannot create Delivery Unit as content vendor is not defined for this system
- Cannot create encoder for Option of Product type, because Product type is represented as a row
- Qt Tcp多线程下QObject:Can not create children that is in different thread 的解决方法
- 使用TOMCAT5.5连接池连接mysql(解决Cannot create JDBC driver of class '' for connect URL 'null' 及can not load org.gjt.mm.mysql.Driver)