关于qt主线程和次线程的一点疑惑
其中main函数所在的线程id(主线程id)和worker、A类的对象所打印的线程id一致,都是0Xa80,worker在调用start()后会运行run(),此时打印的线程id是次线程id 0X140。不过让我不解的是为什么继承自QObject的两个对象打印出的线程id却和主线程id不一样,是0X3b29f8?难道这两个类的对象不是在主线程创建的吗?求达人解答下
[解决办法]
cout<<"obj construct:"<<QThread::currentThread()<<endl; 你这句话是不是打错了,应该是QThread::currentThreadId()吧。
[解决办法]
> 因为qthread类就是一个qobject,它是在主线程创建的,自然它的那些非run()函数以及各种数据成员都属于主线程
QThread是用来表示线程的一个类,而不是线程自身
函数和数据成员本身并不“属于”某一个具体的线程,而是在哪一个线程中被调用/访问
注意:
1)QThread::currentThread()是返回当前运行的那个QThread对象的指针
2)QThread::currentThreadId()是返回当前运行的那个线程的ID
你的两个从QObject继承来的类是打印的currentThread,当然和currentThreadId不一样啊
[解决办法]
其实你在run里面创建一个对象,然后用信号关联一个槽,你会发现信号发来的时候,槽是在线程里面执行的,一般多是这么做的,并不是把代码全写到run里面去。
[解决办法]
> 另外,“函数和数据成员本身并不“属于”某一个具体的线程”,请允许我稍微打个问号,我看qt官方文档说,"A QObject instance is said to live in the thread in which it is created. Events to that object are dispatched by that thread's event loop. ”。我觉得这应该是说一个object对象还是有自己所归属的线程的,只不过它的数据和函数可以在其它线程里被访问(但是这样不能保证安全,比如socket或者timer等,在另一个线程里访问这些对象会发生错误)
我的意思是,这个对象不会因为线程的销毁而自动销毁(当然除非你设置了相应的parent-child关系)
在Qt里面,如果对象A位于线程B里面,那通过auto connect触发的slot都会在线程B上执行
至于你说的安全访问的问题,其实是线程安全的问题,因为绝大多数的Qt类并没有用mutex等对代码做保护
[解决办法]
是的,把工作丢给run来作,这样的做法是可以的,但是不推荐