Qt多线程
有两种多线程的方法,其中一种是继承QThread的run函数,另外一种是把一个继承于QObject的类转移到一个Thread里。
Qt4.8之前都是使用继承QThread的run这种方法,但是Qt4.8之后,Qt官方建议使用第二种方法。
QThread线程
QThread只有run函数是在新线程里的,其他所有函数都在QThread生成的线程里。
上锁
在UI线程下调用QThread的非run函数(其实也不应该直接调用run函数,而应该使用start函数),和执行普通函数无区别,这时,如果这个函数要对QThread的某个变量进行变更,而这个变量在run函数里也会被用到,这时就需要注意加锁的问题, 因为可能这个变量前几毫秒刚刚在run中调用,再调用时已经被另外的线程修改了。
QMutex mutex;
mutex.lock();
mutex.unlock();
如何正确结束继承QThread线程
主线程修改bool变量,子线程循环判断bool变量,run运行完会发射finish信号
继承QObject的多线程实现
用QObject来实现多线程有个非常好的优点,就是默认就支持事件循环(Qt的许多非GUI类也需要事件循环支持,如QTimer、QTcpSocket),QThread要支持事件循环需要在QThread::run(