确定QProcess是否正在等待用户输入

时间:2018-10-31 01:08:22

标签: c++ qt stdin qprocess qt5.11

我正在开发一个应用程序(在Qt 5.11中开发,工具链MSVS2017 64位),该应用程序有时必须执行.bat脚本。该.bat脚本将使用适当的cmd行参数调用某些程序。脚本和程序将位于同一目录中。该程序可能要求也可能不需要用户最后按Enter。如果程序要求用户按Enter,则除非在stdin中写换行符,否则程序永远不会结束。

我想检查程序是否尝试等待用户输入,然后再尝试写入其标准输入,如果可能的话,仅使用Qt库。

.bat脚本将仅调用程序:

Program arg1 arg2 arg3...

在应用程序中,脚本将使用QProcess执行:
 程序开始后添加了舒缓功能

QProcess process;
process.setWorkingDirectory("C:/path/to/script");
process.start("cmd /C C:/path/to/script/script.bat");

QThread::sleep(someTimeout);  // give enough time for process to finish

if (/*somehow*/ process.isWaitingForInput())
    proces.write("\n");
process.waitForFinished();
process.readAllStandardOutput();
process.readAllStandardInput();
proces.exitCode();

我发现similar question的答案指向MSDN WaitForInputIdle

将来可能会移植到Linux或Mac,如果可能的话,我想避免

#if defined(WIN32)
    WaitForInputIdle(...)
#else
    PosixAlternative(...)
#endif

也许也是话题,但我很好奇,是否可以通过cmd / terminal窗口与std输出一起显示的方式从QProcess执行.bat脚本?

1 个答案:

答案 0 :(得分:2)

我不确定检查子进程是否在等待用户输入是否有意义-首先,因为我不认为有任何现实的方法可以这样做,其次,因为没有必要-您/ write()到QProcess的任何数据都将在子进程尝试从stdin读取时进行缓冲和读取。 (根据定义,子进程将相对于您自己的进程异步执行,因此,任何依赖于知道子进程“当前正在做”的方法都会产生内在的怀疑,因为子进程当前正在做的事情可以并且会随时更改,恕不另行通知。在您的过程有时间做出反应之前,一瞬间到下一瞬间)

可以(如果需要)执行的操作是读取子进程的stdout和/或stderr流,并对子进程的输出做出反应。 (例如,如果您知道子进程会在某个时候将enter your decision now ->打印到stdout,则可以从QProcess的StandardOutput通道中读取stdout数据,并在看到该字符串时做出适当的反应)