QT多线程使用方式中常用的是
方式一:继承QThread,重写run函数,使用start函数开始;
方式二:继承QObject,新建QThread对象thread,使用QObject的moveToThread函数将QObject运行在thread中,使用start函数开始。
区别是什么?
跨线程使用信号槽时,根据线程使用方式和信号槽连接方式的不同,实际槽所运行的位置也不一样,结论如下:
使用方式一,实际此线程的槽函数根据连接时所选择的连接方式
1.QueueConnection方式 运行在创建此QThread派生对象的线程中
2.DirectConection方式 运行在触发信号的线程中
使用方式二,例如MoveToThread(A) ,实际此线程的槽函数根据连接时所选择的连接方式
1.QueueConnection方式 运行在A线程中
2.DirectConection方式 运行在触发信号的线程中
实际意义是什么?
1.当实际运行的目标槽函数是一个死循环时,无法使用方式二,因为这样会导致始终在槽中运行,无法接收其他信号,即事件循环失去响应。
2.当信号槽的实时性要求很高时,跨线程信号槽,且触发信号的线程和创建对象的线程为同一线程时无法使用方式一,这样会导致触发信号以后不会立即执行下一条语句,而会先执行槽。
3.当同时运行的线程数量比较多的时候,也不能使用方式一,这样会导致所有线程的槽函数都在一个线程中运行,继而发生信号无法及时响应的现象。
使用建议:
主要负责发送信号的或者是带死循环的槽使用方式一,主要负责响应信号的线程使用方式二。