QProcess.startDetached () и записать в его стандартный ввод - PullRequest
4 голосов
/ 09 мая 2011

Что не так с этим кодом?Я не могу написать в stdin нового процесса, который был отключен.Для меня важно, чтобы новый процесс был отсоединен.

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 ]

7 голосов
/ 09 мая 2011

Доброе утро.

Проблема в том, что QProcess::startDetached() - это статический метод, который создает процесс "забей и забудь".

Это означает, что вы не можете установить этот рабочий каталогпуть.Все, что вы можете сделать, это позвонить по номеру

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

Это, однако, оставляет проблему с записью в stdin недавно созданного процесса.Дело в том, что, поскольку у вас нет QProcess объекта, вы ничего не можете записать в свой stdin.Может быть решение с использованием дескриптора процесса, предоставляемого статическим методом startDetached().

У нас была похожая проблема в нашей компании.Нам нужны отдельные процессы, которые выходят за рамки срока службы вызывающей программы и для которых мы можем установить среду.Это казалось невозможным, глядя на код Qt.

Мое решение состояло в том, чтобы использовать обертку вокруг QProcess с ее собственным startDetached() методом.Что он сделал, он фактически создал этот подкласс QProcess в куче и использовал его обычный метод start().Однако в этом режиме сигнал, который срабатывает после завершения процесса, вызывает слот, который удаляет сам объект: delete this;.Оно работает.Процесс выполняется независимо, и мы можем установить среду.

Таким образом, в принципе нет необходимости использовать метод отдельного запуска.Вы можете использовать обычный метод запуска, если ваш QProcess является объектом в куче.И если вы заботитесь об утечках памяти в этом сценарии, вам придется предоставить механизм, аналогичный описанному выше.

С уважением
D

0 голосов
/ 14 февраля 2018

вызов статического метода с аргументами не обеспечивает какого-либо набора процессов в дочернюю команду.

process.startDetached(command)

попробуйте это:

QProcess process;
process.setProgram(fileName);
process.setArgument(argsList);
process.setWorkingDirectory(dirName);
process.startDetached();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...