Russian Qt Forum
Ноябрь 24, 2024, 17:57
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
QThread, как с ним работать, где почитать подробно?
Страниц: [
1
]
2
3
4
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: QThread, как с ним работать, где почитать подробно? (Прочитано 32816 раз)
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
QThread, как с ним работать, где почитать подробно?
«
:
Март 29, 2010, 11:32 »
некий транслятор создает некий код для некоего интерпретатора (не QScript) и потом надо запустить интерпретатор, чтобы этот код выполнялся в независимой нити, а управление могло вернуться в объект, связанный с пользовательским интерфейсом, то есть, чтобы пользователь мог видеть результаты выполнения кода, что-то еще делать, не связанное с изменением этого кода
как это правильно сделать? где можно подробнее прочитать о работе QThread, с несколькими примерами, использование start()/exit() и т.д.
попытка выполнить в run() просто сначала start(), потом запустить интерпретатор, приводит к падению интерпретатора, некоторые данные в коде оказываются разрушены, хотя во время его выполнения ничего больше не делается, но падает не сразу, интерпретатор выполняет несколько первых инструкций, в том числе, достаточно сложных, работающих со стеком, и с объектами в куче, но потом похоже портится куча, поскольку интерпретатор получает, вместо указателя на объект в куче, указатель 0xfeeefeee
при запуске в приложении в одной нити этот же интерпретатор работает на ура, выполняется все замечательно, проблем нет вообще никаких
в общем, где хорошо описан QThread и есть примеры решения похожих задач?
Записан
2^7-1 == 127, задумайтесь...
garryHotDog
Гость
Re: QThread, как с ним работать, где почитать подробно?
«
Ответ #1 :
Март 29, 2010, 12:25 »
Привет! Во первых документация QT! Во вторых google.com (он знает все)
....а вообще во всех книгах по Qt все расписано оч. хорошо...вот напримре книга -
http://lib.rus.ec/b/138880
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: QThread, как с ним работать, где почитать подробно?
«
Ответ #2 :
Март 29, 2010, 12:44 »
по документации не видно почти ничего, нет никаких тонкостей...
книга эта есть в печатном виде, и там тоже нет ответа на мой вопрос - почему может портиться куча (пока единственный разумный ответ - куча в библиотеках MinGW не имеет встроенной защиты на случай многопоточности, в отличие от MFC, хотя это выглядит более чем странно), как надо бы строить приложение и взаимодействие объектов, наследующих QThread, как правильнее использовать сигналы-слоты в этом случае (например, мне надо из одного треда в другой передавать строки, как правильно реализовать очередь строк, если тредов интерпретатора будет запущено несколько?)
а про мутексы и семафоры я читал, пародон, в начале 90-х, тут у Шлее нет ничего для меня нового
«
Последнее редактирование: Март 29, 2010, 12:59 от Гурман
»
Записан
2^7-1 == 127, задумайтесь...
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: QThread, как с ним работать, где почитать подробно?
«
Ответ #3 :
Март 29, 2010, 12:58 »
ну раз читал, то и используй их
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QThread, как с ним работать, где почитать подробно?
«
Ответ #4 :
Март 29, 2010, 12:58 »
Может быть лучше сделать сначала например простое чтение файла: унаследоваться от QThread, определить run() и наладить взаимодействие между читающим run и индикатором загрузки файла, который в главной нитке. Потом будет гораздо яснее с интерпретатором и.т.п. Сейчас во всех книгах Вы найдете примерно одинаковые фразы, которые конечно правильны, но не дают почувствовать на практике.
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: QThread, как с ним работать, где почитать подробно?
«
Ответ #5 :
Март 29, 2010, 13:09 »
мне не надо из файла читать, у меня есть окно, в которое производится вывод сообщений, как в консоль, интерпретатор выводит туда сообщения, несколько появляются, потом падение по ошибке обращения по несуществующему адресу или в интерпретаторе, или где-то в коде Qt, который выводит текст в окно, во всех случаях проблемы с динамически захваченными объектами, испорчены указатели
Цитировать
ну раз читал, то и используй их
где?? самому переписать распределение памяти с защитой на семафорах???
в интерпретаторе есть куски старого кода на С, который использует malloc/calloc - с MFC все работало на ура, запускали интерпретатор в отдельном треде, программы выполнялись, при этом интерфейс задачи был живой, работал, интерпретатор хватал себе куски памяти, интерфейс программы и она сама тоже хватали себе куски памяти, никаких конфликтов не было
а сейчас ощущение такое, будто конфликт возникает при распределении памяти, рушится куча, иначе пока трудно объяснить, почему при выводе сообщений все рассыпается
есть правда еще одна мысль... надо ее проверить...
Цитировать
Сейчас во всех книгах Вы найдете примерно одинаковые фразы
ну я об этом и спрашиваю, может где-то уже есть более подробно описанная работа с QThread и сигнал-слотами, может на веб-страницах, блогах, уже хорошо известное... гуглом буду долго искать, а надо дело делать
/*забыл написать, что вопрос тем, кто знает ответ, а не умеет предлагать пользоваться поисковиками - как правило, их советуют те, кто сам только недавно научился ими пользоваться*/
«
Последнее редактирование: Март 29, 2010, 13:12 от Гурман
»
Записан
2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QThread, как с ним работать, где почитать подробно?
«
Ответ #6 :
Март 29, 2010, 13:33 »
Цитата: Гурман от Март 29, 2010, 13:09
/*забыл написать, что вопрос тем, кто знает ответ,
Ответ на что? "Почему валится моя задача?"
1) Где почитать: Assistant.
а) описание класса QThread
б) описание типов connect
в) метод thread для QObject
2) Распределения памяти сводятся к malloc который thread-safe, так что переписывание распределения памяти от Вас не требуется
3)
Цитата: Гурман от Март 29, 2010, 13:09
мне не надо из файла читать, у меня есть окно, в которое производится вывод сообщений, как в консоль, интерпретатор выводит туда сообщения, несколько появляются, потом ...
Если уж Вы такой быстрый и тратить время на учебный пример не желаете, то стоит проверить, не лезете ли Вы в окно из нитки расчета - здесь Вы точно crash получите т.к. все вызовы UI должны выполняться только в главной нитке
Записан
developer
Гость
Re: QThread, как с ним работать, где почитать подробно?
«
Ответ #7 :
Март 29, 2010, 13:39 »
http://www.ics.com/learning/icsnetwork/
Посмотри сюда, здесь видео уроки от ICS, по нитях там очень хорошо расказано.
Записан
pastor
Administrator
Джедай : наставник для всех
Offline
Сообщений: 2901
Re: QThread, как с ним работать, где почитать подробно?
«
Ответ #8 :
Март 29, 2010, 13:42 »
Гурман, выложи код сюда, посмотрим почему валится.
Про работу с потоками ты также можешь почитать в разделе ассистанта
Thread Support in Qt
Записан
Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: QThread, как с ним работать, где почитать подробно?
«
Ответ #9 :
Март 29, 2010, 14:04 »
Цитировать
стоит проверить, не лезете ли Вы в окно из нитки расчета
ну так оно и есть... несколько удручен, что в такой мощной штуке, как Qt, интерфейсные объекты могут работать только в главной нити
раньше этого не замечал, поскольку казалось, что такого быть просто не может
причем это буквально удар под дых...
хотя данная проблема разрешилась связью объекта-интерпретатора и окна сообщений через сигнал-слот, удручает, что нельзя простым способом в интерпретаторе создавать интерфейсные объекты
очень удручает...
«
Последнее редактирование: Март 29, 2010, 14:08 от Гурман
»
Записан
2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QThread, как с ним работать, где почитать подробно?
«
Ответ #10 :
Март 29, 2010, 14:38 »
Цитата: Гурман от Март 29, 2010, 14:04
..данная проблема разрешилась связью объекта-интерпретатора и окна сообщений через сигнал-слот,
А Вы уверены что разрешилась? Или просто "сейчас не падает"? Проверьте на всякий случай тип коннекта
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: QThread, как с ним работать, где почитать подробно?
«
Ответ #11 :
Март 29, 2010, 15:18 »
не, не разрешилась
причем если явно указывать Qt::QueuedConnection, то не работает вообще, выводится одна строка правильно, за ней некорректная, и все заканчивается
а по умолчанию похоже связывает через Qt::DirectConnection, потом не падает, но не успевает выводить целиком все строки (QTextEdit)
и хоть бы где было написано, что run() еще раз вызывается в start()...
«
Последнее редактирование: Март 29, 2010, 15:32 от Гурман
»
Записан
2^7-1 == 127, задумайтесь...
lit-uriy
Джедай : наставник для всех
Offline
Сообщений: 3880
Re: QThread, как с ним работать, где почитать подробно?
«
Ответ #12 :
Март 29, 2010, 15:27 »
>>а по умолчанию похоже связывает через Qt::DirectConnection
нет не прямое, в асиситенте написан тип умалчиваемого соединения. Тут гадать не зачем
Записан
Юра.
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: QThread, как с ним работать, где почитать подробно?
«
Ответ #13 :
Март 29, 2010, 15:32 »
там написано, что по умолчанию Qt::QueuedConnection, но если его явно указать, то не работает, если попытаться QBlockingQueuedConnection, эффект точно такой же
а если через очередь, то почему не все строки успевают вставляться в QTextEdit?
Записан
2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QThread, как с ним работать, где почитать подробно?
«
Ответ #14 :
Март 29, 2010, 16:01 »
Цитата: Гурман от Март 29, 2010, 15:32
там написано, что по умолчанию Qt::QueuedConnection, но если его явно указать, то не работает, если попытаться QBlockingQueuedConnection, эффект точно такой же
Перед вызовом connect вставьте тестовую печать thread() для объектов сигнал/слот чтобы посмотреть где они были созданы. Ну и вообще консоль смотрите, там Qt часто выводит полезную информацию
Записан
Страниц: [
1
]
2
3
4
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...