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

Determine if QProcess is waiting for user input

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

我想在尝试写入其标准输入之前检查程序是否正在等待用户输入,如果可能的话只使用 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 with answer pointing to MSDN WaitForInputIdle

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

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

此外,也许是主题,但我很好奇,是否可以以 cmd/terminal window 与标准输出一起显示的方式从 QProcess 执行 .bat 脚本?

我不确定检查子进程是否正在等待用户输入是否有意义 -- 首先,因为我认为没有任何现实的方法可以做到这一点,其次,因为没有必要-- 您 write() 到 QProcess 的任何数据都将被缓冲并由子进程读取 if/when 它确实尝试从标准输入读取。 (根据定义,子进程将相对于您自己的进程异步执行,因此任何依赖于了解子进程的方法 "is currently doing" 本质上是可疑的,因为子进程当前正在做的事情可以并且将会更改,恕不另行通知一个瞬间到另一个,在你的进程有时间做出反应之前)

可以做的(如果您愿意)是读取子进程的标准输出and/or stderr 流,并对子进程的输出做出反应。 (例如,如果您知道子进程将在某个时候打印 enter your decision now -> 到标准输出,您可以从 QProcess 的 StandardOutput 通道读取标准输出数据,并在看到该字符串时做出适当的反应)