gpt4 book ai didi

c++ - 如何避免使用 QProcess 的 waitForStarted 来阻止 GUI 卡住?

转载 作者:行者123 更新时间:2023-11-30 03:39:45 29 4
gpt4 key购买 nike

我正在使用 QProcess 运行 wscript 以运行将 Excel 文件转换为制表符分隔文本文件的 VB 脚本。脚本运行一切正常,但 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 运行将 excel 文件转换为文本文件的 VB 脚本,然后存储新文本文件的路径。这需要很长时间(4 个 excel 文件大约需要 20 秒)。在此期间,GUI 被卡住。我希望用户能够使用不干扰进程的 GUI 部分。

现在我怀疑是这个问题的原因

QProcess::waitForFinished()

而且我已经在线阅读了有关连接 QProcess 的 finished() 和 error() 信号以消除此问题的信息。但是我一直很难这样做。我将这段代码作为继承自 QObject 并包含 Q_OBJECT 宏的类的方法运行,因此应该设置所有内容。我只需要一些帮助来将其余部分放在一起。我怎样才能使我的 GUI 在 QProcess 运行时不卡住?请帮忙。

最佳答案

在名为 Synchronous Process API 的部分引用文档:

  • waitForStarted() blocks until the process has started.
  • waitForReadyRead() blocks until new data is available for reading on the current read channel.
  • waitForBytesWritten() blocks until one payload of data has been written to the process.
  • waitForFinished() blocks until the process has finished.

Calling these functions from the main thread (the thread that calls QApplication::exec()) may cause your user interface to freeze.

记住这一点。但是,您可以使用类似 that 的方法来解决此问题。 :

connect(process, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
[=](int exitCode, QProcess::ExitStatus exitStatus){ /* ... */ });

注意还有一些signals这可能适合任何期望的目的。

关于c++ - 如何避免使用 QProcess 的 waitForStarted 来阻止 GUI 卡住?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38576399/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com