В чем причина ошибки QProcess 5?

У меня есть несколько потоков, выполняющих следующий QProcess. Случайно они терпят неудачу с состоянием ошибки 5. Документы Qt не дают больше подробностей. Кто-нибудь знает, откуда эта ошибка? Большое спасибо.

extCmd = new QProcess(this);

QString cmd = "/usr/bin/php";
QStringList argStr;
argStr << "/bin/sleep" << "10"; // changed to ever working command
extCmd->start(cmd, args);
bool suc = extCmd->waitForFinished(-1);
if (!suc) {
   qDebug() << "finishing failed error=" 
            << extCmd.error() 
            << extCmd.errorString();
}

Дает мне вывод:

finishing failed error= 5 "Unknown error"

1 ответ

Решение

Касательно вашей проблемы является тот факт, что вы не должны запускать поток для каждого процесса. QProcess испускает finished(int code, QProcess::ExitStatus status) сигнал, когда это будет сделано. Это также будет излучать started() а также error() при успешном и неудачном запуске соответственно. Подключите все эти три сигнала к слоту в QObject, затем запустите процесс и обработайте результаты в слотах. Вам не понадобятся дополнительные темы.

Если вы получите started() сигнал, то вы можете быть уверены, что имя файла процесса было правильным, и процесс был запущен. Какой бы код выхода вы не получили finished(int) затем указывает на то, что сделал процесс, возможно, в ответ на потенциально недопустимые аргументы, которые вы, возможно, передали ему. Если вы получите error() сигнал, процесс не запустился, потому что вы дали неправильное имя файла QProcess::start()или у вас нет правильных разрешений.

Вы не должны писать синхронный код там, где все происходит асинхронно. Синхронный код - это код, который блокирует выполнение определенной вещи, например, вызова waitForCmdFinished, Мне бы хотелось, чтобы был флаг конфигурации Qt, который отключает все эти оставшиеся API синхронной блокировки, точно так же, как есть флаг для отключения / включения API поддержки Qt 3. Простая доступность этих блокирующих API способствует ужасным взломам, подобным коду выше. Эти API должны быть отключены по умолчанию IMHO. Так же, как должен быть тест для перемещения QThread и производных классов в другой поток. Это также признак плохого дизайна в каждом примере общедоступного кода, который я смог найти, и я провел довольно тщательный поиск, чтобы убедиться, что я не сумасшедший или что-то в этом роде.

Единственное разумное использование, которое я помню для waitxxx Метод в Qt - это ожидание завершения QThread. Даже тогда это следует вызывать только изнутри ~QThread, чтобы предотвратить разрушение QThread при работающем протекторе.

Другие вопросы по тегам