问题描述

使用 QProcess 类创建的进程无法启动。

代码 1

subProcess->setWorkingDirectory( currentPath );
subProcess->setProgram( app_path );
subProcess->setArguments( cmd );
subProcess->open( )

描述:实验效果在  bool QProcess::open(QIODeviceBase::OpenMode mode = ReadWrite) 自身返回 true,运行成功,但在任务列表无法找到进程(使用 qint64 QProcess::processId() const 查找进程id )

代码 2

subProcess->setWorkingDirectory( currentPath );
subProcess->setProgram( app_path );
subProcess->setArguments( cmd );
subProcess->start( )

描述:实验效果在 bool QProcess::waitForStarted(int msecs = 30000) 自身返回 true,运行成功,但在任务列表无法找到进程(使用 qint64 QProcess::processId() const 查找进程id )

代码 3

subProcess->setWorkingDirectory( currentPath );
subProcess->setProgram( app_path );
subProcess->setArguments( cmd );
subProcess->startDetached( )

描述:实验效果在 bool QProcess::waitForStarted(int msecs = 30000) 自身返回 true,运行成功,并且在任务列表找到进程(使用 qint64 QProcess::processId() const 查找进程id )

总结问题

  1. 使用 void QProcess::start(const QString &program, const QStringList &arguments = {}, QIODeviceBase::OpenMode mode = ReadWrite) 一系成员启动子进程将会失败
  2. 使用 bool QProcess::startDetached(const QString &program, const QStringList &arguments = {}, const QString &workingDirectory = QString(), qint64 *pid = nullptr) 一系成员启动子进程将会成功

bool QProcess::open(QIODeviceBase::OpenMode mode = ReadWrite) 是 void QProcess::start(const QString &program, const QStringList &arguments = {}, QIODeviceBase::OpenMode mode = ReadWrite) 的别名,区别在于 open 自动返回,而不需使用 bool QProcess::waitForStarted(int msecs = 30000) 观察返回。

bool QProcess::startDetached(const QString &program, const QStringList &arguments = {}, const QString &workingDirectory = QString(), qint64 *pid = nullptr) 允许的子进程就会失去消息信号的调用权限,它更加接近使用第三进程来调用子进程,而并非使用主进程来调用子进程。

解决方式

防止阻塞

通常出现进程成功,但是任务列表无法找到匹配的id进程是因为进程没有足够的时间在任务管理器当中注册进程信息。而其中最大的原因是主进程在执行任务,而子进程根本没有机会掌握cpu的执行时间,所以在主进程当中的 QProcess 类是成功的,但在交互系统上,它是失败的。其根本原因是一种客官阻塞,没有任何机会给予它交互。

解决方式是使用 processEvents 函数

官方声明:

[static] void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents) 

调用方式:

// count 记录任务数量,任务为 0 时,退出循环,主进程重新掌控 cpu 时间
while( count ) 
    qApp->processEvents( );

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐