【发布时间】:2014-03-22 07:39:25
【问题描述】:
我是 Qt 的初学者。我需要从桌面应用程序中的按钮调用命令行程序。该程序下载一个 YouTube 视频。我还需要从中读取标准错误。我写了以下代码:
void YoutubeDL::on_downloadButton_clicked()
{
[...]
QProcess p;
p.startDetached("youtube-dl -f " + get + " " + ui->urlBox->text());
QString perr = p.readAllStandardError();
if (perr.length())
ui->descBox->setText("Error during download.\n" + perr);
else
ui->descBox->setText("Download completed!");
}
但是 stderr 读取不会发生。
另一方面,如果我使用非分离的p.start(),然后使用waitForFinished(-1),那么我可以读取标准错误,但 GUI 会冻结,直到下载完成。
如何解决这个问题?
一个相关的问题:我还想要一些能够实时读取下载过程的输出的方法,以便我可以在 GUI 中显示它。 youtube-dl 提供这样的进度报告:
[download] 0.0% of 2.00MiB at 173.22KiB/s ETA 00:12
[download] 0.1% of 2.00MiB at 105.01KiB/s ETA 00:19
[download] 0.3% of 2.00MiB at 96.86KiB/s ETA 00:21
[download] 0.7% of 2.00MiB at 105.23KiB/s ETA 00:19
[download] 1.5% of 2.00MiB at 100.29KiB/s ETA 00:20
...
我希望能够在它们生成时读取它们。
【问题讨论】:
-
我建议您更多地查找 QThread 而不是运行另一个进程。 QThread 允许您在不冻结 GUI 的情况下进行并行计算。
-
我确实尝试过研究 QThread,但对于使用它们的最佳方式似乎没有达成共识。我的研究只让我彻底糊涂了。你能指出我正确的方向吗?
-
你知道什么是线程吗?
-
是的,我在 C 中使用过 pthreads。
-
好的,然后在 Youtube 上搜索“voidrealms”。那家伙已经制作了大约 100 个 Qt 教程。它包含 5-6 个关于 QThread 的教程。我强烈建议您将这些视频中的每一个至少观看 3 次。因为有两种使用 QThread 的技术,其中一种是绝对不正确的,但仍然在互联网上流行。
标签: c++ multithreading qt