QProcess 无法启动子进程
使用 void QProcess::start(const QString &program, const QStringList &arguments = {}, QIODeviceBase::OpenMode mode = ReadWrite) 一系成员启动子进程将会失败。
问题描述
使用 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 )
总结问题
- 使用 void QProcess::start(const QString &program, const QStringList &arguments = {}, QIODeviceBase::OpenMode mode = ReadWrite) 一系成员启动子进程将会失败
- 使用 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( );
更多推荐



所有评论(0)