簡體   English   中英

如何避免QProcess的waitForStarted與QProcess停止凍結?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM