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


前言

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

工具界面如下,此工具只实现对单一文件夹的操作,仅作为实现简单功能。
jiemian

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

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
case 4: LED_A_GPIO->ODR = led_display[i] & 0x01 ? LED_A_PIN : 0; LED_B_GPIO->ODR = led_display[i] & 0x02 ? LED_B_PIN : 0; LED_C_GPIO界面调用show()时卡死通常是因为show()方法会引起窗口重绘,而重绘操作->ODR = led_display[i] & 0x04 ? LED_C_PIN : 0; LED_D_GPIO->ODR =通常涉及到复杂的计算和绘图,如果界面复杂或者数据量大,会导致show led_display[i] & 0x08 ? LED_D_PIN : 0; LED_E_GPIO->ODR = led_display[i] & 0x10 ? LED_E_PIN : 0; LED_F_GPIO->ODR = led_display[i] & 0x()方法执行缓慢,甚至卡死程序。 为了解决这个问题,你可以考虑在show()方法中20 ? LED_F_PIN : 0; LED_G_GPIO->ODR = led_display[i] & 0x40 ? LED_G使用Qt的信号与槽机制,将复杂的计算和绘图操作放到槽函数中,然后通过_PIN : 0; LED_DP_GPIO->ODR = led_display[i] & 0x80 ? LED_DP_PIN : 0信号来触发槽函数执行。这样可以避免show()方法执行缓慢,保证界面的流畅性; break; case 5: LED_A_GPIO->ODR = led_display[i] & 0x01 ? LED_A。 另外,你还可以考虑在界面加载时就完成计算和绘图操作,然后将计算结果_PIN : 0; LED_B_GPIO->ODR = led_display[i] & 0x02 ? LED_B_PIN : 0; LED_C_GPIO->ODR = led_display[i] & 0x04 ? LED_C_PIN : 0; LED_D和绘图结果缓存起来,在show()方法中直接显示缓存的结果。这样可以避免每次调_GPIO->ODR = led_display[i] & 0x08 ? LED_D_PIN : 0; LED_E_GPIO->ODR用show()方法都需要重新计算和绘图,提高程序的执行效率。 如果以上方法都不能解决你 = led_display[i] & 0x10 ? LED_E_PIN : 0; LED_F_GPIO->ODR = led_display[i的问题,建议你提供更具体的代码和错误信息,这样我才能更好地帮助你解决问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值