【问题标题】:QProcess finished SignalQProcess 完成信号
【发布时间】:2020-01-29 20:36:23
【问题描述】:

我们有一个运行 bash 脚本的 QProcess。脚本正确完成并产生预期的输出,但完成后的信号需要很长时间(分钟)才能发出。基本上,我们的脚本是从作为参数提供的文件列表中生成加密的 tarball。最后一个包完好无损地保存在磁盘上,但 Process 需要很长时间才能返回。这会阻止我们的 UI 继续执行下一个任务,因为我们需要确保脚本以编程方式运行完成,而不是通过检查。除了

,我们什么都没做
connect(myProcess, SIGNAL(finished()), mySlot, SLOT(tidyUp()));
myProcess.start();

我们可以用 Qt 监控文件的大小,我们可以根据我们提供给脚本的文件列表来估计它的最终大小,但是在文件达到估计值后脚本会挂起很长时间尺寸。我们已经插入了同步语句,但这似乎没有任何效果。当脚本在命令行上运行时,文件会增长,一旦达到最终大小,脚本就会停止。

为什么 QProcess 没有在脚本完成后立即发送完成信号?

我们非常希望附上一个进度条来指示生成的文件大小的百分比,或者提供一些其他的进度指示,但我们被这种行为难住了。我们尝试将工作线程移至 QThread,并在繁忙的循环中直接运行 QProcess,调用 processEvents(),但无济于事。

【问题讨论】:

  • 从未见过,这可能需要更多上下文,例如执行的脚本。
  • 您是否尝试过使用myProcess.startDetached()?此外,Qt 文档建议像这样显式绑定完成()信号 connect(process, QOverload::of(&QProcess::finished), ....);.

标签: bash qt qthread qprocess


【解决方案1】:

原来这是我在管道中使用的命令的问题。 GPG 相当快地取出文件(虽然时间相当可变),但在文件本身达到其最终大小后,通常会花费大量时间空闲/工作。我不确定它在做什么,或者为什么它只在相同内容的某些运行中起作用,但最终它完成了,脚本完成了,我得到了我的finished() 信号。如果文件大小有一段时间没有改变,我可能需要放置一个更精细的进度条,切换到忙等待,但看起来 Qt 在这里按预期工作。

【讨论】: