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信号。