![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
zuze |
![]()
Сообщение
#1
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Пожалуйста помогите мне с вопросами связанные с программой состоящей из двух потоков.
Описание: Программа создаёт окно в котором три кнопки. Первая кнопка запускает и останавливает поток "А". Вторая кнопка запускает и останавливает поток "В". Третья кнопка выход из программы. Поток "А" печатает символ "А". Поток "В" печатает символ "В". Создал проект и в нём сделал 5 файлов с кодом: 1. main.cpp 2. thread.cpp 3. thread.h 4. threaddialog.cpp 5. threaddialog.h Файл main.cpp
Файл thread.cpp
Файл thread.h
Файл threaddialog.cpp
Файл threaddialog.h
1. В "Nokia Qt SDK Win online v1.0.2 (2010)" при запуске терминала выдаётся ошибка "Failed to read env file: No error". 2. В "Nokia Qt SDK Win offline v1.2.1 (2012)" Данные потоков почему-то выводятся в окне "Вывод приложения", аналог окна "Консоль приложения" в старых версиях. Если, запускаешь два потока очень быстро подвисает Qt Creator. Если запускаешь терминал выдаётся ошибка "Failed to read env file: No error". Вопросы: 1. Почему в "Nokia Qt SDK Win online v1.0.2 (2010)" не выводятся результаты потоков и как это поправить? 2. Правильно ли что в "Nokia Qt SDK Win offline v1.2.1 (2012)" результаты потоков выводятся в окне "Вывод приложения", а не в терминале? 3. Подвисает Qt Creator после запуска двух потоков это следствие того что я в программе не сделал синхронизацию потоков? 4. Если есть ещё какие-то нюансы которые я не заметил, напишите пожалуйста? |
|
|
RazrFalcon |
![]()
Сообщение
#2
|
![]() Zombie Mod ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: ![]() ![]() ![]() |
Повисает скорее всего потому что это винда, а вы пытаетесь на всех парах выводить строку.
И судя по коду, она будет выводится очень быстро, из-за чего qt creator повиснет. На лине такого не будет, в силу особенностей реализации. Что бы не повисало - попробуйте выводить текст по таймеру, к примеру, каждые 100мс и тп. Как вариант, попробуйте вместо cerr - qDebug(). Тогда больше вероятность появления текста в консоли. И лучше создавать потоки нестатичными.
|
|
|
zuze |
![]()
Сообщение
#3
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
RazrFalcon, попробовал cerr заменить на qDebug(). Результат этого такой в "Nokia Qt SDK Win offline v1.2.1 (2012)" ничего не изменилось, а в "Nokia Qt SDK Win online v1.0.2 (2010)" данные потока начали выводиться в окне "Консоль приложения". Но вроде это окно совершенно для других целей, а не для вывода результатов программы. Что ещё можно сделать или окно "Консоль приложения" это третий вариант вывода данных программы в Qt?
|
|
|
Iron Bug |
![]()
Сообщение
#4
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
многопоточная безопасность при синхронизации стандартных потоков ввода-вывода гаратирована только в стандарте C++11. я не знаю, поддерживает ли компилятор для Nokia в этом примере стандарт С++11.
в прочих реализациях конкуренция потоков за вывод данных может приводить к нарушениям памяти. Сообщение отредактировал Iron Bug - 4.11.2012, 21:26 |
|
|
zuze |
![]()
Сообщение
#5
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Может что не выводиться в терминале виноват мой файл проекта в который я что-то не вписал?
Файл проекта Project3.pro
На всякий случай хочу сказать, что я сижу под Microsoft Windows 7 x64. |
|
|
zuze |
![]()
Сообщение
#6
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Я попробовал сделать так, на примере программы которая выводятся только строка текстовая "Hello":
Настройка: 1. "Убрал галочку возле пункта "Запускать в терминале" не подходит. 2. Слева в Qt Creator нажал "Проекты->Собрать->Среда сборки->Подробнее и поставил галочку возле "Чистая системная среда". Результат такой: 1. Если выполнил только первую настройку, то в терминале высвечивается "Failed to read env file: No error". 2. Если выполняю только вторую настройку, то в терминал не появляется, а "Hello" выводится в окне "Вывод приложения" и когда я пытаюсь закрыть окно "Вывод приложения" меня предупреждают, что программа ещё почему-то выполняется. 3. Если выполнил обе настройки, то терминал выводиться пустым и в окне "Вывод приложения" результат не появляется. Значит и для моей программы с потоками эти настройки не помогут, а жаль. 1. "Убрал галочку возле пункта "Запускать в терминале" не подходит. Не "Убрал", а "Поставил". |
|
|
Litkevich Yuriy |
![]()
Сообщение
#7
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
конкуренция потоков за вывод данных может приводить к нарушениям памяти. zuze, другими словами - обычно меняют некую переменную из разных потоков, а в основном потоке (и единственном) выводят эту переменную на экран.Что ещё можно сделать или окно "Консоль приложения" это третий вариант вывода данных программы в Qt? я почти не пользуюсь Креатором, но в первых версиях у него была настройка - "объединять потоки stdout и stderr", если они объеденены, то то всё что в эти потоки отправляется будет видно в одном и том же месте.А вот выводить ли в отдельно открывающуюся консоль или внутри Креатора, зависит от состояния упомянутой тобой галочки: "Запускать в терминале" |
|
|
zuze |
![]()
Сообщение
#8
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Litkevich Yuriy, большое спасибо! Теперь я понял, что данные программы могут выводиться, помимо графически и терминала, также в самом Qt Creator и это не ошибка. Для меня это ново, так как в других средах программирования такого не было. Данную среду программирования я только недавно начал изучать.
|
|
|
Алексей1153 |
![]()
Сообщение
#9
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
zuze, это всё следует из стандартных потоков ввода-вывода - когда запускаешь дочерний процесс, можно перехватить его поток вывода
http://ru.wikipedia.org/wiki/%D0%A4%D0%B0%...B5_%D0%A1%D0%B8 |
|
|
zuze |
![]()
Сообщение
#10
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Алексей1153, большое спасибо за статью. Буду со всем этим разбираться. Я только написал программу по нажатию на кнопку выскакивала надпись "Hello World!" и мне сказали сразу пиши уже процессы. Хорошо что я их немного на gcc писал. Так что у меня поначалу могут возникать совсем детские вопросы, так как в этой среде программирования новичок.
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 3.5.2025, 16:34 |