如何在 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 执行它们时打印真正的 QProcess 参数列表

如何使用 QProcess 通过 Ping 检测“网络不可达”?

如何使用 QProcess 运行 vim 终端

如何在不冻结 UI 的情况下使用 QProcess 循环的输出更新 UI?