К вашей проблеме имеет отношение тот факт, что вы не должны не запускать поток для каждого процесса. QProcess посылает сигнал finished(int code, QProcess::ExitStatus status)
, когда это делается. Он также будет выдавать started()
и error()
при успешном и неудачном запуске соответственно. Подключите все эти три сигнала к слоту в QObject, затем запустите процесс и обработайте результаты в слотах. Вам не понадобятся дополнительные нити.
Если вы получите сигнал started()
, то можете быть уверены, что имя файла процесса было правильным, и процесс был запущен. Какой бы код выхода вы ни получили от finished(int)
, он указывает на то, что сделал процесс, возможно, в ответ на потенциально недопустимые аргументы, которые вы могли ему передать. Если вы получаете сигнал error()
, процесс не запустился, потому что вы дали неверное имя файла QProcess::start()
или у вас нет правильных разрешений.
Вы не должны писать синхронный код, в котором все происходит асинхронно. Синхронный код — это код, который блокирует выполнение определенных действий, например вызов waitForCmdFinished
. Я бы хотел, чтобы был флаг конфигурации Qt, который отключает все эти оставшиеся API-интерфейсы синхронной блокировки, точно так же, как есть флаг для отключения/включения API-интерфейсов поддержки Qt 3. Сама по себе доступность этих блокирующих API способствует совершению ужасных взломов, подобных приведенному выше коду. Эти API должны быть отключены по умолчанию ИМХО. Так же, как должен быть тест на перемещение QThread и производных классов в другой поток. Это также признак плохого дизайна в каждом примере общедоступного кода, который я мог найти, и я провел довольно тщательный поиск, чтобы убедить себя, что я не сумасшедший или что-то в этом роде.
Единственное разумное использование метода waitxxx
в Qt, которое я помню, — это ожидание завершения QThread. Даже в этом случае это следует вызывать только из ~QThread
, чтобы предотвратить разрушение QThread при работающем протекторе.
person
Community
schedule
31.05.2012
/bin/sleep 10
. Теперь я вижу, что параметрwaitForFinished()
не действует: -1 и 20000 всегда терпят неудачу. Как это может быть? - person spikey   schedule 29.05.2012Error 5
или с другим? И, из любопытства, сколько потоков вы запускаете одновременно? - person cmannett85   schedule 29.05.2012QSocketNotifier: Internal error
. :-( - person spikey   schedule 29.05.2012extCmd.exitCode()
равно 0, аextCmd.state()
равно 2 послеwaitForFinished(-1)
, еслиbool suc
ложно. - person spikey   schedule 29.05.2012QThreadPool
и ограничить его количеством ядер, но я сомневаюсь, что это имеет какое-либо отношение к вашим проблемам. - person cmannett85   schedule 30.05.2012