![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
Azazello |
![]()
Сообщение
#1
|
Студент ![]() Группа: Новичок Сообщений: 16 Регистрация: 17.4.2010 Пользователь №: 1635 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Всем привет
Подскажите пожалуйста, что не так в коде ниже, и как можно сделать вывод процесса, запущенного в отдельном потоке в textEdit (как я понял, надо сначала передавать данные в основной поток) Задача - запуск из GUI приложения процесса, в отдельном потоке и вывод полученной, в результате его выполнения, информации в textEdit. mainwindow.cpp
mainwindow.h
thread.cpp
thread.h
На данный момент при попытке компиляции, программа вылетает. Если трассировать вручную, то отладчик пишет:
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#2
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Cannot create children for a parent that is in a different thread. нельзя создавать дочерний объект, находящийся в другом, от родителя, потоке//как передать вывод из созданного потока в основной? в дополнительном потоке посылать сигнал. А в основном создать слот и соединить его с этим сигналом
|
|
|
Azazello |
![]()
Сообщение
#3
|
Студент ![]() Группа: Новичок Сообщений: 16 Регистрация: 17.4.2010 Пользователь №: 1635 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
нельзя создавать дочерний объект, находящийся в другом, от родителя, потоке Перевести-то я перевел, но только не понял, что этим мне хочет сказать компилятор... в дополнительном потоке посылать сигнал. А в основном создать слот и соединить его с этим сигналом Направление понял, буду пробовать. Спасибо. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#4
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Azazello |
![]()
Сообщение
#5
|
Студент ![]() Группа: Новичок Сообщений: 16 Регистрация: 17.4.2010 Пользователь №: 1635 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
А, все, дошло ) Спасибо!
|
|
|
Azazello |
![]()
Сообщение
#6
|
Студент ![]() Группа: Новичок Сообщений: 16 Регистрация: 17.4.2010 Пользователь №: 1635 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Пытаюсь сделать вывод из дочернего потока в textEdit основного:
Добавил: mainwindow.cpp
mainwindow.h
Функцию run() переделал:
thread.cpp
thread.h
По нажатию на кнопку, прога вылетает. Я вот думаю, может процесс не успевает сделать вывод? Но ведь по идее для этого вызов идет через emit, или я что-то не правильно понимаю? ![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#7
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Azazello |
![]()
Сообщение
#8
|
Студент ![]() Группа: Новичок Сообщений: 16 Регистрация: 17.4.2010 Пользователь №: 1635 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
у тебя слот не доступен для других объектов, он ЛИЧНЫЙ (private) данного класса. сделай его открытым (public) Юрий, спасибо за ответ. Но, к сожалению, ситуацию это не меняет. Я пробовал объявлять его в public slots. Поток создается, но после этого приложение вылетает с "The program has unexpectedly finished." Пробовал также запускать через отладчик, чтобы понять, в чем причина, но кроме того, что создается поток больше ничего не ясно... |
|
|
igor_bogomolov |
![]()
Сообщение
#9
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
На сколько я понимаю, setOutput(QString) будет вызван в дочернем потоке, а в этом слоте по всей видимости идет обращение к GUI. С GUI нельзя работать вне основного потока, поэтому и получаем вылет.
Попробуй сделать следущие изменения в коде
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#10
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
igor_bogomolov |
![]()
Сообщение
#11
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
по идее Qt сама выбирает тип соединения и указывать явно не нужно. Иногда нужно. MainWindow и ServerThread созданы с контексте одного потока поэтому м/у ниму тип соединения будет Qt::DirectConnectionМожно в принципе воспользоваться moveToThread, тогда тип соединения автоматически установится правильным |
|
|
Azazello |
![]()
Сообщение
#12
|
Студент ![]() Группа: Новичок Сообщений: 16 Регистрация: 17.4.2010 Пользователь №: 1635 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
igor_bogomolov, Litkevich Yuriy, большое спасибо за ответы.
Игорь, я попробовал сделать как Вы посоветовали, но, к сожалению, и это не помогло. Возможно, я просто что-то упустил, какую-нибудь мелоч. Выкладываю весь проект, может это внесет ясность, а то я уже и не знаю, что можно сделать. Перечитал уже сотню другую страниц форумов, ассистента и книжек, а результата никакого... |
|
|
igor_bogomolov |
![]()
Сообщение
#13
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Блин, слепой я. Ты же ServerThread на стеке создаёшь. После исполнения функции он у тебя удаляется.
Сделай так
|
|
|
Azazello |
![]()
Сообщение
#14
|
Студент ![]() Группа: Новичок Сообщений: 16 Регистрация: 17.4.2010 Пользователь №: 1635 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Действительно, поставив создание потока на обработчик кнопки, я не учел то, что он не останется по выходу из функции. Теперь ясно, что означало "QThread: Destroyed while thread is still running".
Отладчиком стали видится данные вывода в QByteArray, но упорно продолжает вылетать с unexpectedly finished... И трассировать что-то нормально не выходит, не понятно ничего ![]() Я уже и, как советовали, выность ф-цию наружу пробовал,
объявляя класс в mainwindow.h и инициируя запуск в обработчике кнопки:
и все равно результат тот же ![]() |
|
|
igor_bogomolov |
![]()
Сообщение
#15
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Держи тестовый пример. Он правда для Windows, поэтому если ты делаешь для Linux строчки
могут быть лишними, просто закоментируй---Добавлено-------------- Кратко, проблема просто в невнимательности. Ты делаешь доступ к несуществующему объекту Объекта process у тебя не существует, т.к. ты его не создал. То что ты создаешь в run это совершенно другой объект доступа до которого ты не имеешь. P.S. Мой пример тоже не без недостатков, но для демонстрации сойдёт ![]()
Прикрепленные файлы
|
|
|
Azazello |
![]()
Сообщение
#16
|
Студент ![]() Группа: Новичок Сообщений: 16 Регистрация: 17.4.2010 Пользователь №: 1635 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Кратко, проблема просто в невнимательности. И почему я так и думал ![]() Игорь, спасибо тебе громадное. И не только за пример, но и за все ответы, которые мне очень помогли не просто тупо переписать, а именно понять свою ошибку. Мой самый искренний респект тебе! |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 10.6.2025, 0:02 |