关于qt主线程和次线程的一点疑惑
最近比较关注qt的多线程。看了http://apps.hi.baidu.com/share/detail/23550552 这篇文章后,才发现自己以前对qt的多线程认识是错的!比如自己写一个qthread子类,除了run()这个函数是在次线程执行的,其它函数都是在主线程被调用的,因为qthread类就是一个qobject,它是在主线程创建的,自然它的那些非run()函数以及各种数据成员都属于主线程。
我自己写了个小的测试程序,分别在主线程中实例化QThread子类对象、QObject子类对象、以及一个自己定义的基类对象,然后在这些对象构造函数里分别打印当前的QthreadId。在主线程中定义的对象自然应该和主线程id一致,可是结果却并非如此:
Object/ObjectNew是我定义的两个继承自QObject类的子类,它们都在各自的构造函数里打印当前线程的id,比如
Worker类继承自QThread类,我分别让它在构造函数和run()函数中打印当前的threadid。
然后还定义了一个无父类的类A,让它在构造函数里打印当前线程id:
最后我在main函数中实例化这些类的对象
[code=C/C++]
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
cout<<"main thread:"<<QThread::currentThreadId()<<endl;
Worker worker;
worker.start();
ObjectNew objnew;
Object obj;
A b;
return a.exec();
}
运行结果截图:

其中main函数所在的线程id(主线程id)和worker、A类的对象所打印的线程id一致,都是0Xa80,worker在调用start()后会运行run(),此时打印的线程id是次线程id 0X140。不过让我不解的是为什么继承自QObject的两个对象打印出的线程id却和主线程id不一样,是0X3b29f8?难道这两个类的对象不是在主线程创建的吗?求达人解答下
我自己写了个小的测试程序,分别在主线程中实例化QThread子类对象、QObject子类对象、以及一个自己定义的基类对象,然后在这些对象构造函数里分别打印当前的QthreadId。在主线程中定义的对象自然应该和主线程id一致,可是结果却并非如此:
Object/ObjectNew是我定义的两个继承自QObject类的子类,它们都在各自的构造函数里打印当前线程的id,比如
Object::Object(QObject *parent) :
QObject(parent)
{
cout<<"obj construct:"<<QThread::currentThread()<<endl;
}
Worker类继承自QThread类,我分别让它在构造函数和run()函数中打印当前的threadid。
Worker::Worker(QObject *parent) :
QThread(parent)
{
cout<<"work thread construct:"<<QThread::currentThreadId()<<endl;
}
void Worker::run()
{
cout<<"thread running:"<<QThread::currentThreadId()<<endl;
exec();
}
然后还定义了一个无父类的类A,让它在构造函数里打印当前线程id:
A::A()
{
cout<<"A instance construct"<<QThread::currentThreadId()<<endl;
}
最后我在main函数中实例化这些类的对象
[code=C/C++]
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
cout<<"main thread:"<<QThread::currentThreadId()<<endl;
Worker worker;
worker.start();
ObjectNew objnew;
Object obj;
A b;
return a.exec();
}
运行结果截图:

其中main函数所在的线程id(主线程id)和worker、A类的对象所打印的线程id一致,都是0Xa80,worker在调用start()后会运行run(),此时打印的线程id是次线程id 0X140。不过让我不解的是为什么继承自QObject的两个对象打印出的线程id却和主线程id不一样,是0X3b29f8?难道这两个类的对象不是在主线程创建的吗?求达人解答下
...全文
相关推荐
Qt主线程与次线程通信实例代码
Qt主线程与次线程通信实例代码,方便大家学习下载使用! Qt主线程与次线程通信实例代码,方便大家学习下载使用! Qt主线程与次线程通信实例代码,方便大家学习下载使用!
QT 主线程子线程互相传值
QT多线程专栏共有14篇文章,从初识线程到、QMutex锁、QSemaphore信号量、Emit、Sgnals、Slot主线程子线程互相传值同步变量、QWaitCondition、事件循环、QObjects、线程安全、线程同步、线程异步、QThreadPool线程池等线程操作进行了全面!深入!的研究和详细的说明
【QT】:线程之间的通信操作(主线程与子线程,子线程与子线程和主线程同时通信,附源码案例)
多线程之间的变量传递
qt 多线程 防止主线程做循环操作导致界面假死
qt 多线程 防止主线程做循环操作导致界面假死。试过多线程的几种方法,只有这个方法可行。代码亲测可行。在子线程死循环,界面正常不死!!!
Qt子线程更新数据发到主线程显示.rar
Qt的子线程无法直接更新主UI,需要发送信号到主线程进行更新,我用的QTableWidget展示数据。


