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