欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

解决Qt调用bat脚本操作文件夹界面卡死问题

程序员文章站 2022-10-28 13:07:21
目录前言一、QtConCurrent::run()介绍二、QtConCurrent::run()使用1.导入模块2.增加线程中执行的函数3.通过QFuture控制线程函数开始,结束。三、调用bat脚本四、代码下载前言编写了一个通过界面操作实现对文件夹的复制压缩和解压的工具,如果是单独调用脚本或用命令实现,在操作大文件夹的情况下界面会出现假死,因此可以使用QtConCurrent::run()启动一个线程来执行调用脚本功能。工具界面如下,此工具只实现对单一文件夹的操作,仅作为实现简单功能。一、...




前言

编写了一个通过界面操作实现对文件夹的复制压缩和解压的工具,如果是单独调用脚本或用命令实现,在操作大文件夹的情况下界面会出现假死,因此可以使用QtConCurrent::run()启动一个线程来执行调用脚本功能。

工具界面如下,此工具只实现对单一文件夹的操作,仅作为实现简单功能。
解决Qt调用bat脚本操作文件夹界面卡死问题

一、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代码下载

本文地址:https://blog.csdn.net/weixin_43361880/article/details/109002011