QProcess.startDetached()并写入其stdin

use*_*297 4 qt qt4

这段代码有什么问题?我无法写入已被分离的新进程的标准输入.对我而言,新流程是分离的,这一点非常重要.

QProcess commandLine;
commandLine.setWorkingDirectory("E:\\");  //does not work.
commandLine.startDetached("cmd.exe");     //works (but uses wrong working dir).
commandLine.write("echo hi\0");           //writes nothing.
commandLine.write("\n\r");                //Still nothing is written!
Run Code Online (Sandbox Code Playgroud)

Dar*_*sig 7

早上好.

问题是,这QProcess::startDetached()是一种静态方法,可以创建"即发即弃"的过程.

这意味着,您无法以这种方式设置工作目录.你所能做的只是打电话

QProcess::startDetached (const QString &program, const QStringList &arguments, const   QString &workingDirectory);
Run Code Online (Sandbox Code Playgroud)

但是这会让您遇到写入新创建的进程的标准输入的问题.问题是,因为你没有一个QProcess对象,所以没有什么可以写你的stdin.可能存在使用该过程处理静态startDetached()方法提供的解决方案.

我们在公司遇到了类似的问题.我们需要超出调用程序生命周期的分离进程,我们可以为其设置环境.这看起来像Qt代码,不可能.

我的解决方案是使用QProcess自己的startDetached()方法包装.它做了什么,它实际上在QProcess堆上创建了这个子类并使用了它的普通start()方法.然而,在这种模式下,一旦进程完成就会触发的信号会在一个删除对象本身的插槽上调用:delete this;.有用.该过程独立运行,我们可以设置一个环境.

所以基本上没有必要使用分离的启动方法.只要您QProcess是堆上的对象,就可以使用普通的start方法.如果您在这种情况下关心内存泄漏,则必须提供与上述类似的机制.

最好的问候
D.