一种使用QThread线程的新方法 moveToThread
工作中使用QT开发遇到使用多线程,对于线程的创建,研究后发现有些疑惑。各执一词先上两个链接:
王:https://blog.****.net/sydnash/article/details/7425947
刘:http://www.cnblogs.com/wangshaowei/p/8384474.html
QThread似乎是很难的一个东西,特别是信号和槽,有非常多的人(尽管使用者本人往往不知道)在用不恰当(甚至错误)的方式在使用QThread,随便用google一搜,就能搜出大量结果出来。无怪乎Qt的开发人员 Bradley T. Hughes声嘶力竭地喊you are-doing-it-wrong。
通过测试,在mainwidow.cxx使用上面的代码的时候,由于my调用了movetothread函数,那么它所有的槽函数都是执行在新开辟的线程里面。
如果去掉moveToThread函数,那么所有的函数都将执行在gui线程里面。
同时为了测试connect的第五个参数,在connect的时候可以将Qt::QueuedConnection修改为Qt::DirectConnection,这样所有的槽函数也将在主线程里面执行。
最终,使用move toThread这种真正的多线程。
推荐的方法
千呼万唤始出来。
其实,这个方法太简单,太好用了。定义一个普通的QObject派生类,然后将其对象move到QThread中。使用信号和槽时根本不用考虑多线程的存在。也不用使用QMutex来进行同步,Qt的事件循环会自己自动处理好这个。