QT多线程,阻塞卡顿与正确退出,哪些是运行在子线程的对象?

Qt使用多线程的一些心得

这个帖子排版很乱,内容很多,我摘抄了一些重点的出来,加上了一些自己的体会,其中可能有所缺漏

问题

- 在UI线程调用setSomething();函数和getSomething();函数会不会卡顿?

- 在UI线程调用QThread::quit()或QThread::exit()函数会不会停止线程?

- 在UI线程调用QThread::terminate函数会不会停止线程?

- 如何正确的退出线程?

解答

在非run函数里调用QThread的成员函数,并不是在子线程里运行,是在UI线程中运行的。

线程锁:

QMutexLocker可以安全的使用QMutex,以免忘记解锁(有点类似std::unique_ptr),这样每次循环都会看看是否要马上终止。

在UI线程里调用exit、quit:

quit和exit函数都不会中途终端线程(QThread在不调用exec()情况下是exit函数和quit函数是没有作用的。)

在UI线程里调用terminate:

要马上终止一个线程可以使用terminate函数,但这个函数存在非常不安定因素,不推荐使用。那么如何安全的终止一个线程呢?

 外部调用(UI线程调用)stopImmediately():

在线程需要马上退出时,可以在外部调用stopImmediately()函数终止线程,之前的例子可以知道,由于在主线程调用QThread非run()函数的函数都是在主线程运行,因此,在主线程调用类似m_thread->stopImmediately()会几乎马上把线程的成员变量m_isCanRun设置为false(面对多线程问题要用面向过程的思维思考),因此在子线程的run函数的循环中遇到m_isCanRun的判断后就会退出run函数,继承QThread的函数在运行完run函数后就视为线程完成,会发射finish信号。

原创文章 26 获赞 9 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_34917736/article/details/88993423
今日推荐