互相运行多个QProcess组

时间:2015-07-03 15:24:29

标签: qt asynchronous polling qprocess

我需要多次调用外部程序N。我想同时这样做。所以到目前为止,我的策略是开始N QProcesses,并统计已经开始的和已经完成的。 (所以我可以弄明白他们什么时候完成了)。

然而,外部程序占用了相当多的RAM,因此我不希望任何时候有更多4个并行进程。

对此有什么好的策略?

我认为信号/插槽不足以实现这一目标(我想不出一个没有高度复杂的方法)......也许我可以用队列做点什么?

如何确保我一次只运行4个进程? 我怎样才能弄清楚所有N进程何时最终完成?

(pyside / pyqt的答案首选,但C ++还可以)

2 个答案:

答案 0 :(得分:3)

证明的概念:

h file

#ifndef CPROCESSRUNNER_H
#define CPROCESSRUNNER_H

#include <QObject>
#include <QQueue>

class QProcess;

class CProcessRunner : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int processCount READ processCount WRITE setProcessCount)
public:
    explicit CProcessRunner(QObject *parent = 0);
    ~CProcessRunner();

    void addProcess(const QString& program);

    int processCount() const;

public slots:
    void setProcessCount(int arg);

private slots:
    void startFreeProcesses();

private:
    int getActiveProcessCount() const;

    QQueue<QProcess*> m_processes;
    int m_processCount;
};

#endif // CPROCESSRUNNER_H

cpp文件

#include "CProcessRunner.h"
#include <QProcess>
CProcessRunner::CProcessRunner(QObject *parent)
    : QObject(parent)
    , m_processCount(0)
{

}

CProcessRunner::~CProcessRunner()
{

}

void CProcessRunner::addProcess(const QString& program)
{
    QProcess* pProcess = new QProcess(this);
    pProcess->setObjectName(program);
    m_processes.enqueue(pProcess);
    startFreeProcesses();
}

int CProcessRunner::processCount() const
{
    return m_processCount;
}

void CProcessRunner::setProcessCount(int arg)
{
    m_processCount = arg;
}

void CProcessRunner::startFreeProcesses()
{
    while (!m_processes.isEmpty() && (getActiveProcessCount() < m_processCount)) {
        QProcess* pProcess = m_processes.dequeue();
        connect(pProcess, SIGNAL(finished(int)), this, SLOT(startFreeProcesses()));
        connect(pProcess, SIGNAL(finished(int)), pProcess, SLOT(deleteLater()));

        pProcess->start(pProcess->objectName());
        pProcess->waitForStarted(-1);
    }
}

int CProcessRunner::getActiveProcessCount() const
{
    int result = 0;
    foreach (QProcess* pProcess, findChildren<QProcess*>()) {
        if (pProcess->state() == QProcess::Running) {
            result++;
        }
    }
    return result;
}

答案 1 :(得分:0)

作为参考,这是我目前使用Pyside的实现。 我希望能够捕获每个进程的输出并将其传递(用于显示在例如d!sun!wed!thr!sat 或类似的进程中)。为此,我为每个进程分配了一个数字,并将它的stdout和stderr连接到插槽,然后插槽将发出消息和进程位置。 我不相信我目前对该功能的实现,但这里有:

QTextEdit