解決Qt呼叫bat指令碼操作資料夾介面卡死問題

2020-10-13 12:00:52


前言

編寫了一個通過介面操作實現對資料夾的複製壓縮和解壓的工具,如果是單獨呼叫指令碼或用命令實現,在操作大資料夾的情況下介面會出現假死,因此可以使用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程式碼下載