Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QProcess声明进程在进程仍在运行时退出_C++_Qt_Qprocess - Fatal编程技术网

C++ QProcess声明进程在进程仍在运行时退出

C++ QProcess声明进程在进程仍在运行时退出,c++,qt,qprocess,C++,Qt,Qprocess,我正在Linux中使用QProcess从QThread启动一个外部GUI应用程序。进程成功地进入启动状态(QProcess::starting),然后进入运行状态(QProcess::running),但随后进入停止状态(QProcess::NotRunning,由连接到状态更改(QProcess::ProcessState)信号的插槽验证)QProcess::errorString()返回“未知错误”。外部进程仍在运行,但QProcess对象未将其显示为正在运行 大多数应用程序都会出现这种情况

我正在Linux中使用
QProcess
QThread
启动一个外部GUI应用程序。进程成功地进入启动状态(
QProcess::starting
),然后进入运行状态(
QProcess::running
),但随后进入停止状态(
QProcess::NotRunning
,由连接到
状态更改(QProcess::ProcessState)
信号的插槽验证)
QProcess::errorString()
返回“未知错误”。外部进程仍在运行,但
QProcess
对象未将其显示为正在运行

大多数应用程序都会出现这种情况,但我发现Dolphin file manager和xterm并没有表现出这种行为。有可能还有其他人也在工作。我将Qt5.4.0与Debian8.2Jessie、GCC4.9.2一起使用

有人知道为什么会这样吗?不幸的是,我无法发布完整的示例,因为这需要发布几乎整个应用程序

class RecordingControllerObject : public QObject
{
    Q_OBJECT

public:
    RecordingControllerObject(QObject *parent = 0)
        : QObject(parent)
        ...
        , proc(new QProcess(this))
        ...
    {
        ...
        connect(proc, SIGNAL(stateChanged(QProcess::ProcessState)), SLOT(procStateChanged(QProcess::ProcessState)));
        ...
    }
    virtual ~RecordingControllerObject()
    {
        ...
        if (proc->state() == QProcess::Running)
        {
            proc->terminate();
            proc->waitForFinished(-1);
        }
        delete proc;
        ...
    }

    ...

signals:
    ...

public slots:
    ...

    void startWatcher(const QString &program, const QStringList &arguments)
    {
        qDebug("starting watcher\n");
        if (proc->state() == QProcess::Running)
            proc->kill();
        proc->start(program, arguments);
    }

private slots:
    void readyRead(const QByteArray &buffer)
    {
        if (proc->isOpen())
            proc->write(buffer);
    }

    void procStateChanged(QProcess::ProcessState state)
    {
        std::cout << "proc state changed: " << state << std::endl;
        std::cout << "proc error: " << proc->errorString().toUtf8().constData() << std::endl;
    }

    ...

private:
    ...
    QProcess *proc;
    ...
};
class RecordingControllerObject:公共QObject
{
Q_对象
公众:
RecordingControllerObject(QObject*parent=0)
:QObject(父对象)
...
,proc(新的QProcess(this))
...
{
...
连接(proc,SIGNAL(stateChanged(QProcess::ProcessState)),插槽(procStateChanged(QProcess::ProcessState));
...
}
虚拟~RecordingControllerObject()
{
...
if(proc->state()==QProcess::Running)
{
proc->terminate();
proc->waitForFinished(-1);
}
删除proc;
...
}
...
信号:
...
公众时段:
...
void startWatcher(常量QString和程序、常量QString和参数)
{
qDebug(“启动观察程序”);
if(proc->state()==QProcess::Running)
proc->kill();
proc->start(程序、参数);
}
专用插槽:
void readyRead(常量QByteArray和缓冲区)
{
如果(proc->isOpen())
进程->写入(缓冲区);
}
无效procStateChanged(QProcess::ProcessState状态)
{

std::你不能尝试启动另一个应用程序,比如普通xterm吗?另外,将QProcess的所有信号连接到调试槽或lambda,并打印它们得到的任何错误/状态/结果代码,如果你还没有全部捕获。如果所有应用程序都发生了这种情况,那么创建一个最小的示例来重现问题,并将其添加到问题中(或者,如果复制失败,请找出与真实ap和您创建的最小工作示例的区别)..我希望您不是仅仅为了启动
QProcess
?@peppe-否而使用
QThread
。@peppe-否。该线程实际上是另一个线程的定时控制器,需要运行外部进程。您是否尝试过启动另一个应用程序,如纯xterm?此外,将QProcess的所有信号连接到调试插槽或lambda,并打印任何错误/状态如果你还没有完全掌握它们,它们会得到我们/结果代码。如果所有应用都出现了这种情况,那么创建一个再现问题的最小示例,并将其添加到问题中(或者如果再现失败,那么请找出真实ap与你创建的工作最小示例的区别)..我希望您使用
QThread
不仅仅是为了启动
QProcess
?@peppe-否。该线程实际上是另一个线程的定时控制器,需要运行外部进程。