如何在 QProcess 中使用队列?
Posted
技术标签:
【中文标题】如何在 QProcess 中使用队列?【英文标题】:How can I use a queue with QProcess? 【发布时间】:2011-01-17 12:29:09 【问题描述】:我有一个插槽,称为传递 QProcess 中使用的一些参数。 我使用其中一些参数执行一个外部程序。 问题是我想为这些进程设置一个队列,等到前一个进程完成后再启动下一个。
你认为最好/最简单的方法是什么?
这是我的方法/槽:
void FirstCase::CallApp(QString text, QString pathAndFileName)
QString command = QString("App1.exe %1 -Z %2").arg(pathAndFileName).arg(message);
QProcess* process = new QProcess(this);
process->start(command);
编辑这里是解决方案,如果你需要的话:
按照 QStringList 的想法,我的 CallApp 方法只是将命令添加到 QStringList 中,如下所示:
list << command;
然后调用Execute();
void FirstCase::Execute()
if(!list_.isEmpty()&&!executing_)
QProcess* p = new QProcess(this);
QString c = list_.takeFirst();
p->start(c);
executing_=TRUE;
connect(p, SIGNAL(finished(int)),this,SLOT(ExecFinished()));
void FirstCase::ExecFinished()
executing__=FALSE;
Execute();
【问题讨论】:
我强烈建议使用带有分隔参数的 start() 的 QStringList 重载。否则你很快就会遇到引用问题(例如,如果你执行的程序在其路径中有空格)。 QStringList() 版本自动进行引用。 你使用的finished信号错了,请看下面我的回答。 【参考方案1】:您可以使用 QString 队列将命令排队并存储它们。然后,从队列的顶部开始,启动一个新进程并将其finished() 信号连接到一个槽。当该进程完成时,如果队列不为空,则启动一个新进程,依此类推。
【讨论】:
【参考方案2】:finished
函数的正确签名是;
void QProcess::finished ( int exitCode, QProcess::ExitStatus exitStatus )
所以你应该这样连接;
connect(p, SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(ExecFinished()));
【讨论】:
以上是关于如何在 QProcess 中使用队列?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 PySide 中获取 QProcess 运行的命令的输出?
如何在 QProcess 执行它们时打印真正的 QProcess 参数列表