Название: QThread&QProcess Отправлено: Az от Май 01, 2010, 22:08 Всем привет.
Коллеги, можно попросить вас самый элементарный пример запуска процесса (например любой команды консоли) в отдельном потоке, GUI приложения? Хотя бы в общих чертах. Для понимания, связи с чем возник вопрос: Есть приложение, у которой есть 2 чекбокса, один - lsof, второй - strace. Еще есть textEdit, в которую читается вывод команд и кнопка запуска. Смысл в том, чтобы можно было одновременно запустить и strace и lsof, в 2 разных потоках. Насколько я понял, нужно создавать отдельный слот для вывода из потоков в основной? Название: Re: QThread&QProcess Отправлено: Az от Май 01, 2010, 23:23 Начал по-тихоньку писать, исходя из найденных кусков кода и страниц ассистента.
mainwindow.cpp Код
mainwindow.h Код
thread.cpp Код
thread.h Код
Хочу пока просто вывести вывод команды uname в отдельном потоке. Но не совсем пойму, как именно делать вывод из созданного потока в основной. На данный момент при попытке компиляции, программа вылетает. Если трассировать вручную, то отладчик пишет: Код: QObject: Cannot create children for a parent that is in a different thread. Название: Re: QThread&QProcess Отправлено: spectre71 от Май 02, 2010, 10:25 Хочу пока просто вывести вывод команды uname в отдельном потоке. Но не совсем пойму, как именно делать вывод из созданного потока в основной. На данный момент при попытке компиляции, программа вылетает. Если трассировать вручную, то отладчик пишет: Код: QObject: Cannot create children for a parent that is in a different thread. Все правильно, нелязя создать дочерний QObject от родителя из друргого потока. ServerThread - родитель, создавался в главном потоке и живет в нем, а process - содается в другом потоке => не может быть ребенком ServerThread ( Можешь сделать так: Код
Название: Re: QThread&QProcess Отправлено: Az от Май 02, 2010, 13:31 А, так вот оно в чем проблема была. Понял.
Спасибо тебе, друг! Название: Re: QThread&QProcess Отправлено: Marat(Qt) от Май 02, 2010, 15:42 Я думаю понятно, что QProcess не должна быть локальной переменной. А работу с QProcess необязательно в отдельный тред выносить. Просто делаешь process.start в основном потоке и все. Т.к. процесс(например strace) - отдельная программа, то и выполняется он операционной системой как отдельная программа, т.е. QProcess::start не вешает gui.
Название: Re: QThread&QProcess Отправлено: Az от Май 02, 2010, 17:37 Я думаю понятно, что QProcess не должна быть локальной переменной. А работу с QProcess необязательно в отдельный тред выносить. Просто делаешь process.start в основном потоке и все. Т.к. процесс(например strace) - отдельная программа, то и выполняется он операционной системой как отдельная программа, т.е. QProcess::start не вешает gui. Если бы вывод был только strace, то да, но основнаяа задача - одновременный запуск strace и lsof, и мне кажется, что их выполнение в одном потоке приведет к вылету, как и случается, если дать обе команды одновременно в терминале. Исходя из этого, я и подумал, что лучше наверное создавать для каждого свой поток. Застрял тут я с выводом данных из дочернего потока: Если в ф-цию output добавить: Код предварительно объявив сигнал в классе thread. И попробовать выводить данные как-нибудь так: Код где setOutput() Код Но все равно что-то не то. Кстати, еще по теме, как корректно завершить поток, чтобы не получалось: Код: QThread: Destroyed while thread is still running Название: Re: QThread&QProcess Отправлено: Az от Май 02, 2010, 21:23 Нашел один серьезный косяк, из-за которого и сыпались "QThread: Destroyed while thread is still running"
У меня создание потока висело в стеке на обработчике кнопки, по выходу из котрого он благополучно умирал. Объявил Код и ошибки прекратились, в массив bytes данные заносятся, но дальше не идет, вылетает... Название: Re: QThread&QProcess Отправлено: Az от Май 02, 2010, 21:59 Проблема решена, тема закрыта.
Я, дурак, обращался к несуществующему объекту process. |