这段代码有什么问题?我无法写入已被分离的新进程的标准输入。 对我而言,新流程是分离的非常重要。
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!
答案 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();