前言:
很多时候,我们的某个函数非常耗时,会造成系统卡顿,但这个函数又不会经常调用,如果另外建立一个线程类,又得去维护,得不偿失,这个时候,我们就希望在子线程执行该函数,执行完自动释放。 这里介绍两个方法:
1、使用QtConcurrent
QtConcurrent
是命名空间 (namespace
),它提供了高层次的函数接口 (APIs
),使所写程序,可根据计算机的 CPU 核数,自动调整运行的线程数目。
1.1、 函数原型
QFuture<T> QtConcurrent::run(QThreadPool::globalInstance(), function, ...) ;
QFuture<T> QtConcurrent::run(QThreadPool *pool, Function function, ...);
1.2、使用准备
使用QtConcurrent
需要在.pro文件增加 QT += concurrent
如果是使用VS+Qt
,则需要增加模块Concurrent
1.3、实例
#include <QString>
#include <QDebug>
#include <QThread>
#include <QApplication>
#include "qtconcurrentrun.h"
using namespace QtConcurrent;
void func(QString name)
{
qDebug() << name << "from" << QThread::currentThread();
}
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QFuture<void> fut1 = run(func, QString("Thread 1"));
QFuture<void> fut2 = run(func, QString("Thread 2"));
fut1.waitForFinished();
fut2.waitForFinished();
}
运行结果如下:
"Thread 1" from QThread(0x1b74fd2ebc0, name = "Thread (pooled)")
"Thread 2" from QThread(0x1b74fd534e0, name = "Thread (pooled)")
如果频繁使用,最好用一个线程池以减少与系统的交互
extern void func();
QThreadPool pool;
QFuture<void> future = QtConcurrent::run(&pool, func);
更多关于QtConcurrent
的内容请参阅Qt帮助文档嘿嘿^-^
2、使用Windows
函数CreateThread
线程有两种声明方式
(1)DWORD WINAPI 函数名 (LPVOID lpParam); //标准格式
DWORD WINAPI 函数名 (LPVOID lpParam)
{
return 0;
}
CreateThread(NULL, 0, 函数名, 0, 0, 0);
(2)void 函数名();
使用void 函数名()此种线程声明方式时,lpStartAddress需要加入LPTHREAD_START_ROUTINE转换,如
void 函数名()
{
return;
}
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)函数名, 0, 0, 0);
unsigned int func1() {//...}
HANDLE hThread;
DWORD dwRet = 0;
hThread = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)func1,this,NULL,&dwRet);
WaitForSingleObject(hThread ,INFINTE);//INFINTE表示无限期等待
CloseHandle(hThread); //关闭线程
hThread = INVALID_HANDLE_VALUE;
来源:CSDN
作者:52_赫兹的鲸
链接:https://blog.csdn.net/qq_40194498/article/details/103624730