Aak*_*ain 3 c++ qt multithreading
我是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!");
}
Run Code Online (Sandbox Code Playgroud)
然而,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
...
Run Code Online (Sandbox Code Playgroud)
我希望能够在生成它们时阅读这些内容.
由于问题的性质,上述所有答案都是不正确的.@aakashjain要求一个独立的过程.你们建议的仅适用于启动过程仍然附加的情况.
QProcess p
p.startDetached(...)
Run Code Online (Sandbox Code Playgroud)
是相同的
QProcess::startDetached(...)
Run Code Online (Sandbox Code Playgroud)
QProcess :: startDetached()是一个静态方法,它不是任何对象的一部分或返回一个.一旦调用此方法并且成功,该过程将不再以任何方式附加到生成它的过程(您的应用程序).
我建议你先看看这个方法的官方文档,然后阅读有关进程间通信的更多信息,以及如何将一个进程的输出传递给另一个进程(在这种情况下是对终端的分离进程).
我偶然发现了在PyQt4中使用QProcess :: startDetached()的基本控件的问题,其中我做了@DmitrySokolov建议的exaclty.令我惊讶的是,状态始终为零,使用QProcess非静态方法无法设置或检索任何内容.在进行了一些挖掘和询问后,我确切地指出了我在答案开始时所写的内容 - 如果使用QProcess :: startDetached(),则后面的控件必须通过系统工具(例如kill)命令,管道等)因为你没有对象可以实际使用.
QProcess :: startDetached()提供两个重要的返回值:
您可以使用此PID与您喜欢的过程进行交互(当然,过程本身允许您使用)) - 您可以终止它,管道输出,让它进入睡眠状态等.
现在回到你的问题.这里有三种解决方案:
ui->descBox(你也可以添加一个QProgressbar来使输出更加用户友好,并在stdout/stderr中做东西)背景只为你看).我没有测试过这是诚实的,但它应该工作.| 归档时间: |
|
| 查看次数: |
5010 次 |
| 最近记录: |