多线程是一个很大的范围,内容也非常的多,我手上就有三本总计超过1500页的书讲述多线程的问题,这一章只能演示下Qt对多线程提供的一些支持。多线程有很强的平台相关性,很多时候需要用到各平台的API,这对于移植提出了挑战,而Qt提供的线程相关的类可以在各个平台上使用,对于很多开发者来说,这可以节约很多时间和精力。
本章只讨论Qt的线程的一些类及用法,这里假设你已经对线程有一定的了解,类似线程,互斥锁,互斥量,死锁,线程安全,原子操作等一些术语假设你已经了解他们的含义,这里不多做介绍了。
在第二十一章里有个显示本地目录的演示程序,这个程序遇到一个问题,由于需要加载的目录数量过多,程序启动需要花费大量时间,为了在在Linux下运行,甚至取消了有大量文件的两个目录,当然对于一个用于演示的程序来说,这到没有什么太大关系,但这里的真正问题在于:当程序直线某个比较费时的操作时,界面就会卡死。
这里有个很简单的演示程序,这个程序有个选择本地目录的功能,当用户选择了某个目录的话,这个程序就可以显示该目录下所有图片的缩略图,但假如一个目录下的图片比较多,单幅图片比较大时,界面就会处于卡死状态,卡死的时间取决于加载图片的速度,我现在的电脑加载某个目录下大约150图片,总计需要30秒的时间,也就是说在这段时间内,这个程序处于卡死状态,用户无法对程序做任何操作。要解决这个问题,就需要用到多线程,把比较耗时的加载图片的操作放置一个单独的子线程里,这样程序界面就始终处于响应操作,用户不用等待全部图片加载完后才能继续操作。
先看下这个程序的头文件
#include <QDialog>
#include <QPushButton>
#include <QLineEdit>
#include "ReadPix.h"
class PreviewPix : public QDialog
{
Q_OBJECT
private:
QString currentDir_String;
QPushButton* chooseDir_PushButton;
QPushButton* pageUp_PushButton;
QPushButton* pageDown_PushButton;
QList<QPushButton*> previewPix_List;
QList<QPixmap> pix_List;
QLineEdit* currentDir_LineEdit;
ReadPix* readPix_Thread;
public:
PreviewPix(QWid