QThread提供了Qt平台下独立的线程操作。这里简单的介绍一下QThread的内容及其使用方法。
关于多线程的好处不做赘述,应该都清楚。对于Qt而言,它侧重于应用程序图形界面的设计,主UI界面一般是作为主线程来操作,当你需要运行一个比较费时的操作的时候,主线程在后台执行操作,主UI界面表现为卡顿,这个就很不方便,这里我们可以引进多线程。
这里先看一下QThread类在VS下的定义:
class Q_CORE_EXPORT QThread : public QObject
{
public:
static Qt::HANDLE currentThreadId();
static QThread *currentThread();
static int idealThreadCount();
static void yieldCurrentThread();
explicit QThread(QObject *parent = 0);
~QThread();
enum Priority {
IdlePriority,
LowestPriority,
LowPriority,
NormalPriority,
HighPriority,
HighestPriority,
TimeCriticalPriority,
InheritPriority
};
void setPriority(Priority priority);
Priority priority() const;
bool isFinished() const;
bool isRunning() const;
void setStackSize(uint stackSize);
uint stackSize() const;
void exit(int retcode = 0);
public Q_SLOTS:
void start(Priority = InheritPriority);
void terminate();
void quit();
public:
// default argument causes thread to block indefinately
bool wait(unsigned long time = ULONG_MAX);
Q_SIGNALS:
void started();
void finished();
void terminated();
protected:
virtual void run();
int exec();
static void setTerminationEnabled(bool enabled = true);
static void sleep(unsigned long);
static void msleep(unsigned long);
static void usleep(unsigned long);
#ifdef QT3_SUPPORT
public:
inline QT3_SUPPORT bool finished() const { return isFinished(); }
inline QT3_SUPPORT bool running() const { return isRunning(); }
#endif
protected:
QThread(QThreadPrivate &dd, QObject *parent = 0);
private:
Q_OBJECT
Q_DECLARE_PRIVATE(QThread)
static void initialize();
static void cleanup();
friend class QCoreApplication;
friend class QThreadData;
};
QThread这个类首先他继承了QObject这个类,QObject是Qt里面十分底层的一个类,Qt里的object基本都会继承这个类,关于QObject以后可以介绍一下。
static Qt::HANDLE currentThreadId();
返回当前线程的ID号
static QThread *currentThread();
返回线程句柄。
static int idealThreadCount();
返回能被运行在系统上的理想的线程数。
static void yieldCurrentThread();
让开线程给另一个可运行的线程。至于具体执行哪个线程这是有系统调度决定的
前两个成员函数是当前线程的相关,后两个是与系统的所有线程相关。
enum Priority {
IdlePriority,
LowestPriority,
LowPriority,
NormalPriority,
HighPriority,
HighestPriority,
TimeCriticalPriority,
InheritPriority
};
这里枚举了8个线程的优先级
0:最低等级,只有当系统没有线程在运行的时候才执行
1:小于低优先级的等级
2:小于正常线程的等级
3:正常的默认的系统等级
4:高于系统默认优先级的等级
5:大于高优先级的等级
6:尽可能的安排优先级
7:使用同样的优先级
优先级的设置可以通过void setPriority(Priority priority)调用
eg:
thread->setPriority(QThread::HighPriority);
线程状态可以通过通过下面两个变量获取,isFinished和isRunning查询线程的状态,使用wait来阻塞,直到线程已经完成运行。:
bool isFinished() const;//线程已结束
bool isRunning() const;//线程已开启
可以通过槽函数将不同的线程链接起来,并由信号量触发相应的事件
Q_SIGNALS:
void started();
void finished();
void terminated();
public Q_SLOTS:
void start(Priority = InheritPriority);//启动线程
void terminate();//终止线程,不推荐使用
void quit();//退出线程
1、开启线程的方式可以通过start来开始,开始了之后会通过run函数来运行
2、多线程很多情况下是和while循环一起使用,退出的使用不推荐直接使用terminate粗暴的退出,很多时候并不能立马退出,而且还会导致系统崩溃。一般的方式是修改while循坏的条件,让它自己退出循环再结束。
static void sleep(unsigned long);//单位为秒
static void msleep(unsigned long);//单位为毫秒
static void usleep(unsigned long);//单位为微秒
很多时候,我们使用过了线程,但是又不需要立马结束他,如果一直在while循环中,cpu的开销会很大,如果不需要数据的实时性或者只需要线程在等待的时候,最好加上sleep,这样会很多程度的降低系统的开销
void setStackSize(uint stackSize);//设置线程堆栈的大小
uint stackSize() const;
static void setTerminationEnabled(bool enabled = true);//设置terminate有效性
Priority priority() const;//返回当前线程运行级别,不运行就是inheritPriority