Название: [QProcess] После terminate(), либо kill(), ProcessState возвращает Running Отправлено: CerJo от Апрель 23, 2014, 13:07 Всем привет!
Имеется система, в которой по нажатию кнопки основное приложение запускает дочернее. Эта же кнопка должна сие приложение закрывать. После нажатия, приложение запускается. При повторном нажатии - закрывается. Но если снова нажать на кнопку, ничего не происходит. Основная программа запускает дочернюю: Код: QProcess proc; Код: proc.terminate(); 2) При вызове state(), возвращается Running: Код: if (proc.state == QProcess::Running) В связи с этим (как я понимаю), при повторном вызове proc.start, ничего не происходит. Подскажите, пожалуйста, что я делаю не так, или где я ошибаюсь. Заранее спасибо! P. S. Предположил, что время между terminate() и state() мало, но даже после 5 минут ожидания возвращается Running. Название: Re: [QProcess] После terminate(), либо kill(), ProcessState возвращает Running Отправлено: Bepec от Апрель 23, 2014, 15:23 А давайте пофантазируем и представим ваш код. В нём может быть ошибка? Наверное ошибка именно в нём!
Название: Re: [QProcess] После terminate(), либо kill(), ProcessState возвращает Running Отправлено: CerJo от Апрель 24, 2014, 07:35 Привожу код приложения
h-файл: Код: namespace Ui { cpp файл: Код: Controlpanel::Controlpanel(QWidget *parent) : Сообщение "The process was finished" не приходит никогда. Когда основное приложение из стандартного потока вывода дочернего приложения читает код "48", приложение закрывается, но proc.state возвращает running. Код: if (proc.state() != QProcess::Running) { Название: Re: [QProcess] После terminate(), либо kill(), ProcessState возвращает Running Отправлено: Bepec от Апрель 24, 2014, 11:13 Совет №2 новичку - код проекта лучше выкладывать в архиве и прикреплять к сообщение. :) Тогда быстрее помогут разобраться.
Совет №3 инклуды тоже лучше выкладывать, а не обрезать cpp файл :) Проблема в вашем втором приложении. Видимо ошибка там, ибо у меня всё спокойно отрабатывает без излишеств. Выкладывайте код второго, или же скиньте его. Название: Re: [QProcess] После terminate(), либо kill(), ProcessState возвращает Running Отправлено: OKTA от Апрель 24, 2014, 11:39 Если слать terminate(), то это необязательно приведет к завершению процесса, как сказано в доках и как получается на практике.
Я пробовал на винде с calc.exe. Посылается terminate() и убивается само окошко калькулятора, а в процессах продолжает сидеть и сигнал о завершении приходит если вручную его убить в диспетчере. Если пользоваться kill(), то убивается на ура и смертельно, сигнал приходит сразу. На линуксе такое поведение, как у вас, может быть из-за того, что приложение, запускаемое через QProcess, внутри себя запускает еще что-нибудь и из-за этого нет сигнала о завершении процесса и т.д. Попробовать к сожалению сейчас не могу. P.S. Если в винде запускать через QProcess explorer.exe, то сигнал о завершении приходит сразу же, не смотря на то, что ты таких попыток не делал))) Но окошко эксплорера продолжает жить своей жизнью - видимо винда перехватывает процесс. Название: Re: [QProcess] После terminate(), либо kill(), ProcessState возвращает Running Отправлено: Bepec от Апрель 24, 2014, 11:48 В винде explorer при запуске себя лишь посылает главному эксплореру сигнал форкнуться и сразу завершается :) И уже главный эксплорер форкает самого себя :)
Название: Re: [QProcess] После terminate(), либо kill(), ProcessState возвращает Running Отправлено: OKTA от Апрель 24, 2014, 11:58 А вот notepad.exe при terminate() сразу же завершается в отличии от calc.exe.
Шайтан-Винда ;D Название: Re: [QProcess] После terminate(), либо kill(), ProcessState возвращает Running Отправлено: CerJo от Апрель 28, 2014, 10:05 Спасибо за ответы. Временами программа срабатывает, временами нет. К сожалению, выложить код запускаемого процесса не могу - нет исходников.
И terminate() и kill() работают через раз. Т. е. сегодня всё работает, завтра опять приложение не запускается повторно. Грешу на операционку (Эльбрус). Такой вопрос: а что, если объект QProcess сделать динамичным и после kill(), либо terminate() дестроить его, заново запускать конструктор и коннектить. Как я понимаю, это решит только симптомы проблемы, скорей всего будут клониться приложения? Или стоит попробовать? P.S. Попробовал запустить приложение не через QProcess, а руками: при завершении его в консоль приходит сообщение Illegal Instruction. Думаю, это и создаёт проблему. Название: Re: [QProcess] После terminate(), либо kill(), ProcessState возвращает Running Отправлено: OKTA от Апрель 28, 2014, 10:32 Ну да, будешь плодить приложение, если оно не будет успешно завершаться. Попробуй системный kill - если что будешь запоминать pid процесса и добивать его, если QProcess сам не сможет.
Название: Re: [QProcess] После terminate(), либо kill(), ProcessState возвращает Running Отправлено: Bepec от Апрель 28, 2014, 11:05 Вы с приложением руками поработайте. Проблема в нём скорее всего. А Эльбрус насколько я помню тот же linux.
Название: Re: [QProcess] После terminate(), либо kill(), ProcessState возвращает Running Отправлено: OKTA от Апрель 28, 2014, 11:13 Цитировать К сожалению, выложить код запускаемого процесса не могу - нет исходников. Видать не получится поработать. Название: Re: [QProcess] После terminate(), либо kill(), ProcessState возвращает Running Отправлено: CerJo от Апрель 29, 2014, 13:21 Удалось получить картину висящих процессов в системе. На картинке приведён скрин "до" kill() и "после" kill(). Похоже на процесс-зомби. Кто-нибудь знает, как можно это исправить?
Название: Re: [QProcess] После terminate(), либо kill(), ProcessState возвращает Running Отправлено: CerJo от Май 05, 2014, 15:17 Решил проблему, запустив программу с правами суперпользователя.
Всем спасибо. |