2015-11-18 1 views
0

Я планировал использовать QProcess для выполнения программы (.exe) на своем компьютере и обрабатывать файл, который уже существует, затем выводить новый файл и продолжать следующий шаг, весь процесс занимает от 3 до 5 секунд.QProcess возвращает код выхода еще не выходит?

Однако, несмотря на то, что экран процесса, который выполняет процесс, появляется и работает, и я также написал строки кода, чтобы определить, был ли процесс выполнен, затем выполните следующий шаг, но все же не можем остановить проект из делая следующие шаги без ожидания.

Другими словами, мой проект попытается открыть файл, который не существует, поскольку он все еще находится в процессе в предыдущем коде.

Так что я написал простой код для проверки:

QProcess *proc = new QProcess(this); 
ui->textEdit->append(QString("%1").arg(proc->state())); 
ui->textEdit->append(QString("%1").arg(proc->exitCode())); 
ui->textEdit->append(QString("%1").arg(proc->waitForStarted())); 
ui->textEdit->append(QString("%1").arg(proc->waitForFinished())); 
proc->startDetached("cmd"); 
ui->textEdit->append(QString("%1").arg(proc->state())); 
ui->textEdit->append(QString("%1").arg(proc->exitCode())); 
ui->textEdit->append(QString("%1").arg(proc->waitForStarted())); 
ui->textEdit->append(QString("%1").arg(proc->waitForFinished())); 

и результат был все «ноль».

0 
0 
0 
0 
0 
0 
0 
0 

но cmd.exe консоли прямо там, cmd

я понял о функциях ExitCode QProcess в?

ответ

1

Проблема заключается в том, что вы смешиваете API-интерфейс «fire and forget» startDetached с циклом блокировки (non-event loop) waitFor, которые работают с экземпляром QProcess.

Если вы хотите написать блокирующий код, используйте start(), чтобы запустить процесс, а не отдельную версию.

Конечно, для производственного кода вы, вероятно, хотите использовать сигналы и цикл событий, чтобы избежать блокировки вообще, но это не особая проблема.

+0

Ваш ответ дает мне подсказку, я нашел функцию под вызовом QProcess «выполнить», чего я хочу. Он заблокирует процесс до его завершения. – APU

+0

Я понимаю, что start + waitForFinished будет делать то же самое, но я на самом деле не тестировал это. В любом случае, рад, что у вас есть что-то, что работает для ваших нужд. –