Qt/C++在子线程执行函数的三种方法

62 篇文章 104 订阅
17 篇文章 5 订阅

前言:

很多时候,我们的某个函数非常耗时,会造成系统卡顿,但这个函数又不会经常调用,如果另外建立一个线程类,又得去维护,得不偿失,这个时候,我们就希望在子线程执行该函数,执行完自动释放。 这里介绍两个方法:

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(); 
     //调用外部函数
    QFuture<void> f1 =QtConcurrent::run(func,QString(index++));
    //调用类成员函数
    QFuture<void> f2 =QtConcurrent::run(this,&Widget::myFunc,QString("aaa")); 
 	//使用lambda
	 QFuture<void> future = QtConcurrent::run([=]() {
    // Code in this block will run in another thread
});
}

运行结果如下:

"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

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);

//函数声明
static unsigned int func1(LPARAM lParam);  
//函数定义
unsigned int func1(LPARAM lParam) 
{ 
MyClass* pThis = (MyClass*)lParam;
//更多操作 

} 
  
  
//使用
HANDLE hThread; 
DWORD dwRet = 0; 
hThread = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)func1,this,NULL,&dwRet); 
WaitForSingleObject(hThread ,INFINITE);//INFINTE表示无限期等待
CloseHandle(hThread); //关闭线程
hThread = INVALID_HANDLE_VALUE;

3、使用QThread函数create

C++17之后可使用,可使用lambda

4、标准库std::thread

  std::thread  *t1 = new std::thread(&MessageBox::ticktack, this, sec);
  void MessageBox::ticktack(int sec)
{

}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值