如何在 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 中使用队列?的主要内容,如果未能解决你的问题,请参考以下文章