目录
前言
编写了一个通过界面操作实现对文件夹的复制压缩和解压的工具,如果是单独调用脚本或用命令实现,在操作大文件夹的情况下界面会出现假死,因此可以使用QtConCurrent::run()启动一个线程来执行调用脚本功能。工具界面如下,此工具只实现对单一文件夹的操作,仅作为实现简单功能。
一、QtConCurrent::run()介绍
Concurrent是并发的意思,QtConcurrent命名空间提供高层次的API,不需要使用低级线程原语的多线程程序,如互斥,读写锁,等待条件或信号。用QtConcurrent编写的程序会根据可用处理器内核的数量自动调整使用的线程数。
QtConCurrent::run()是QtConcurrent命名空间里的函数。主要功能是启动一个线程来执行一个函数。并且该线程取自全局QThreadPool,该函数的返回值通过QFuture API提供。
二、QtConCurrent::run()使用
1.导入模块
在使用前需要在工程文件中导入模块,否则定义相关头文件时会出现错误。
在(工程名).pro增加一行如下:
QT += concurrent
2.增加线程中执行的函数
以复制文件夹为例,该函数内为调用copy.bat脚本
关键代码如下:
bool mybat::coypProcess()
{
//调用bat脚本
return true;
}
3.通过QFuture控制线程函数开始,结束。
关键代码如下:
QFuture<bool> future = QtConcurrent::run(this,&mybat::coypProcess);
while(!future.isFinished())
{
QApplication::processEvents(QEventLoop::AllEvents, 100);
}
三、调用bat脚本
传入两个参数。
关键代码如下:
QProcess press(NULL);
press.setWorkingDirectory(DirPath);
QString command =DirPath+"\\"+"copy.bat"+ blank + m_filePath + blank + m_objFilePath +"\\";
press.start(command);
press.waitForFinished(-1);
四、代码下载
文件里包含3个使用的bat脚本。
mybat代码下载