[英]How to avoid waitForStarted with QProcess to stop GUI from freezing?
我正在使用QProcess運行wscript來運行VB腳本,該腳本將Excel文件轉換為制表符分隔的文本文件。 該腳本可以正常運行,並且一切正常,但是GUI凍結,並且用戶在相當長的時間內無法與其交互。 這是代碼:
/* Create txt files and store paths */
for (int i = 0; i < excelFilepaths.size(); ++i) {
wscript->start("wscript.exe", QStringList() << vbs.fileName() << excelFilepaths.at(i) << newDir.absolutePath() + "/" + QString::number(i + 1));
wscript->waitForFinished();
payloadPaths.push_back(newDir.absolutePath() + "/" + QString::number(i + 1));
}
因此,發生的事情是我在堆上分配了多個excel文件路徑和一個QProcess。 此QProcess運行VB腳本,該腳本將excel文件轉換為文本文件,然后存儲新文本文件的路徑。 這需要很長時間(4個excel文件大約需要20秒)。 在此期間,GUI被凍結。 我希望用戶能夠使用不干擾該過程的GUI部分。
現在我懷疑這個問題的原因是
QProcess::waitForFinished()
而且我已經在線閱讀了有關連接QProcess的finish()和error()信號以消除此問題的信息。 但是我一直很難做到。 我將此代碼作為從QObject繼承並包含Q_OBJECT宏的類的方法來運行,因此應設置所有內容。 我只需要一些幫助即可將其余各部分放在一起。 如何使QProcess運行時GUI不凍結? 請幫忙。
除了QSerialPort,我遇到了同樣的問題。 但是,我認為解決方案是相同的。 我找不到使“ serial-> waitForReadyRead()”不凍結GUI的方法,因此,我實現了自己的功能。
void Research::WaitSerial(int MilliSecondsToWait)
{
QTime DieTime = QTime::currentTime().addMSecs(MilliSecondsToWait);
flag = 0;
while(QTime::currentTime() < DieTime && !flag)
{
QCoreApplication::processEvents(QEventLoop::AllEvents,100);
if(BufferSerial != "")
{
flag++;
}
}
}
當然,您的問題是相似的但不是相同的。 只需更改if
以使其具有“停止條件”。 希望這可以幫助。
編輯:這最初不是我的想法。 我在某個地方的論壇上找到它。 所以我不學分。
在“ 同步流程API ”部分引用文檔:
waitForStarted()
阻塞,直到進程開始。waitForReadyRead()
阻塞,直到有新數據可在當前讀取通道上讀取為止。waitForBytesWritten()
阻塞,直到將一個數據有效載荷寫入該進程為止。waitForFinished()
阻塞,直到過程完成。從主線程(調用QApplication :: exec()的線程)調用這些函數可能會導致用戶界面凍結。
記住這一點。 然而,你可以使用類似解決這個問題是 :
connect(process, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
[=](int exitCode, QProcess::ExitStatus exitStatus){ /* ... */ });
請注意,還有更多信號可能適合任何期望的目的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.