1 QThread 类概述
QThread类为用户管理多线程提供了一种平台无关的途径。
include <QThread>
2 详述
QThread对象在程序内部进行控制线程的管理,QThread起始于run()函数额执行。默认情况下,run()通过调用exec()启动事件循环(event loop),并在线程内部执行Qt 的事件循环。
线程在程序中用途非常广,常常用于避免程序阻塞、分布式计算、多任务协作等功能。
有的朋友为了达到程序不阻塞、提高运行效率等效果喜欢在一个程序中生成几十甚至几百个线程,然而需要注意的是,很多时候线程太多并不能提高效率,如果线程没有休眠或者等待的话,最多同时运行的数量是CPU的核心数量,CPU需要在诸多线程中切换和调度,反而降低了系统效率。而在另一种情况,如果线程大部分时间是等待(如等待某个返回、读取硬盘等),那么数量稍微增多些的确会提高效率。
所以归纳起来:
- 以计算为主的运算密集型线程数量理论上只要为CPU核心数量即可,如使用线程计算质数组合解析数据等。
- 以等待为主的IO密集型线程数量可以按照具体业务规模适当增加线程,如使用线程读写数据库、硬盘、远程接口获取数据等(具体项目中可以增加的线程而不影响运行效率的阀值需要不同项目具体测试得出)
3 QT中使用多线程
Qt中如何创建使用线程,非常简单,只需要继分为三步:
- 1 创建线程类,继承QThread
- 2重写run()
- 3主线程中创建线程对象,使用start()方法启动线程。
(1) 首先,新建Qt命令行项目,在项目中创建线程类:
CSimpleThread.h
#ifndef CSIMPLETHREAD_H
#define CSIMPLETHREAD_H
#include <QThread>
class CSimpleThread : public QThread
{
Q_OBJECT
public:
CSimpleThread();
};
#endif // CSIMPLETHREAD_H
CSimpleThread.cpp
#include "CSimpleThread.h"
#include <QDebug>
CSimpleThread::CSimpleThread()
{
}
(2) 重写run(),每5秒打印一句话
CSimpleThread.h
#ifndef CSIMPLETHREAD_H
#define CSIMPLETHREAD_H
#include <QThread>
class CSimpleThread : public QThread
{
Q_OBJECT
public:
CSimpleThread();
void run();
};
#endif // CSIMPLETHREAD_H
CSimpleThread.cpp
#include "CSimpleThread.h"
#include <QDebug>
CSimpleThread::CSimpleThread()
{
}
void CSimpleThread::run()
{
while (true) {
qDebug()<<"CSimpleThread run!";
sleep(5);
}
}
(3) 主线程中创建线程对象,使用start()方法启动线程
main.cpp
#include <QCoreApplication>
#include <CSimpleThread.h>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
CSimpleThread *SThread = new CSimpleThread();
SThread->start();
return a.exec();
}
参考文献:千荒箭