我正在开发一个应用程序(在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脚本?
答案 0 :(得分:2)
我不确定检查子进程是否在等待用户输入是否有意义-首先,因为我不认为有任何现实的方法可以这样做,其次,因为没有必要-您/ write()
到QProcess的任何数据都将在子进程尝试从stdin读取时进行缓冲和读取。 (根据定义,子进程将相对于您自己的进程异步执行,因此,任何依赖于知道子进程“当前正在做”的方法都会产生内在的怀疑,因为子进程当前正在做的事情可以并且会随时更改,恕不另行通知。在您的过程有时间做出反应之前,一瞬间到下一瞬间)
可以(如果需要)执行的操作是读取子进程的stdout和/或stderr流,并对子进程的输出做出反应。 (例如,如果您知道子进程会在某个时候将enter your decision now ->
打印到stdout,则可以从QProcess的StandardOutput通道中读取stdout数据,并在看到该字符串时做出适当的反应)