QProcess.startDetached()并写入其stdin

时间:2011-05-09 04:00:26

标签: 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!

2 个答案:

答案 0 :(得分:7)

早上好。

问题在于QProcess::startDetached()是一种静态方法,它会创建一个“即发即弃”的过程。

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

QProcess::startDetached (const QString &program, const QStringList &arguments, const   QString &workingDirectory);

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

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

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

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

最好的问候 d

答案 1 :(得分:0)

使用参数调用static方法不会向child命令提供任何进程集。

process.startDetached(command)

试试这个:

QProcess process;
process.setProgram(fileName);
process.setArgument(argsList);
process.setWorkingDirectory(dirName);
process.startDetached();