Russian Qt Forum
Июнь 03, 2024, 12:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: QThread, как с ним работать, где почитать подробно?  (Прочитано 32119 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Март 29, 2010, 11:32 »

некий транслятор создает некий код для некоего интерпретатора (не QScript) и потом надо запустить интерпретатор, чтобы этот код выполнялся в независимой нити, а управление могло вернуться в объект, связанный с пользовательским интерфейсом, то есть, чтобы пользователь мог видеть результаты выполнения кода, что-то еще делать, не связанное с изменением этого кода

как это правильно сделать? где можно подробнее прочитать о работе QThread, с несколькими примерами, использование start()/exit() и т.д.

попытка выполнить в run() просто сначала start(), потом запустить интерпретатор, приводит к падению интерпретатора, некоторые данные в коде оказываются разрушены, хотя во время его выполнения ничего больше не делается, но падает не сразу, интерпретатор выполняет несколько первых инструкций, в том числе, достаточно сложных, работающих со стеком, и с объектами в куче, но потом похоже портится куча, поскольку интерпретатор получает, вместо указателя на объект в куче, указатель 0xfeeefeee

при запуске в приложении в одной нити этот же интерпретатор работает на ура, выполняется все замечательно, проблем нет вообще никаких

в общем, где хорошо описан QThread и есть примеры решения похожих задач?
Записан

2^7-1 == 127, задумайтесь...
garryHotDog
Гость
« Ответ #1 : Март 29, 2010, 12:25 »

Привет! Во первых документация QT! Во вторых google.com (он знает все) Смеющийся....а вообще во всех книгах по Qt все расписано оч. хорошо...вот напримре книга - http://lib.rus.ec/b/138880
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Март 29, 2010, 12:44 »

по документации не видно почти ничего, нет никаких тонкостей...

книга эта есть в печатном виде, и там тоже нет ответа на мой вопрос - почему может портиться куча (пока единственный разумный ответ - куча в библиотеках MinGW не имеет встроенной защиты на случай многопоточности, в отличие от MFC, хотя это выглядит более чем странно), как надо бы строить приложение и взаимодействие объектов, наследующих QThread, как правильнее использовать сигналы-слоты в этом случае (например, мне надо из одного треда в другой передавать строки, как правильно реализовать очередь строк, если тредов интерпретатора будет запущено несколько?)

а про мутексы и семафоры я читал, пародон, в начале 90-х, тут у Шлее нет ничего для меня нового
« Последнее редактирование: Март 29, 2010, 12:59 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Март 29, 2010, 12:58 »

ну раз читал, то и используй их
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Март 29, 2010, 12:58 »

Может быть лучше сделать сначала например простое чтение файла: унаследоваться от QThread, определить run() и наладить взаимодействие между читающим run и индикатором загрузки файла, который в главной нитке. Потом будет гораздо яснее с интерпретатором и.т.п. Сейчас во всех книгах Вы найдете примерно одинаковые фразы, которые конечно правильны, но не дают почувствовать на практике.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #5 : Март 29, 2010, 13:09 »

мне не надо из файла читать, у меня есть окно, в которое производится вывод сообщений, как в консоль, интерпретатор выводит туда сообщения, несколько появляются, потом падение по ошибке обращения по несуществующему адресу или в интерпретаторе, или где-то в коде Qt, который выводит текст в окно, во всех случаях проблемы с динамически захваченными объектами, испорчены указатели

Цитировать
ну раз читал, то и используй их

где?? самому переписать распределение памяти с защитой на семафорах??? Шокированный

в интерпретаторе есть куски старого кода на С, который использует malloc/calloc - с MFC все работало на ура, запускали интерпретатор в отдельном треде, программы выполнялись, при этом интерфейс задачи был живой, работал, интерпретатор хватал себе куски памяти, интерфейс программы и она сама тоже хватали себе куски памяти, никаких конфликтов не было

а сейчас ощущение такое, будто конфликт возникает при распределении памяти, рушится куча, иначе пока трудно объяснить, почему при выводе сообщений все рассыпается

есть правда еще одна мысль... надо ее проверить...

Цитировать
Сейчас во всех книгах Вы найдете примерно одинаковые фразы

ну я об этом и спрашиваю, может где-то уже есть более подробно описанная работа с QThread и сигнал-слотами, может на веб-страницах, блогах, уже хорошо известное... гуглом буду долго искать, а надо дело делать

/*забыл написать, что вопрос тем, кто знает ответ, а не умеет предлагать пользоваться поисковиками - как правило, их советуют те, кто сам только недавно научился ими пользоваться*/
« Последнее редактирование: Март 29, 2010, 13:12 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Март 29, 2010, 13:33 »

/*забыл написать, что вопрос тем, кто знает ответ,
Ответ на что?  "Почему валится моя задача?"  Улыбающийся

1) Где почитать: Assistant.
а) описание класса QThread
б) описание типов connect
в) метод thread для QObject

2) Распределения памяти сводятся к malloc который thread-safe, так что переписывание распределения памяти от Вас не требуется

3)
мне не надо из файла читать, у меня есть окно, в которое производится вывод сообщений, как в консоль, интерпретатор выводит туда сообщения, несколько появляются, потом ...
Если уж Вы такой быстрый и тратить время на учебный пример не желаете, то стоит проверить, не лезете ли Вы в окно из нитки расчета - здесь Вы точно crash получите т.к. все вызовы UI должны выполняться только в главной нитке
Записан
developer
Гость
« Ответ #7 : Март 29, 2010, 13:39 »

http://www.ics.com/learning/icsnetwork/

Посмотри сюда, здесь видео уроки от ICS, по нитях там очень хорошо расказано.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #8 : Март 29, 2010, 13:42 »

Гурман, выложи код сюда, посмотрим почему валится.

Про работу с потоками ты также можешь почитать в разделе ассистанта Thread Support in Qt
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #9 : Март 29, 2010, 14:04 »

Цитировать
стоит проверить, не лезете ли Вы в окно из нитки расчета

ну так оно и есть... несколько удручен, что в такой мощной штуке, как Qt, интерфейсные объекты могут работать только в главной нити Грустный раньше этого не замечал, поскольку казалось, что такого быть просто не может

причем это буквально удар под дых...  Злой

хотя данная проблема разрешилась связью объекта-интерпретатора и окна сообщений через сигнал-слот, удручает, что нельзя простым способом в интерпретаторе создавать интерфейсные объекты Грустный

очень удручает...
« Последнее редактирование: Март 29, 2010, 14:08 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Март 29, 2010, 14:38 »

..данная проблема разрешилась связью объекта-интерпретатора и окна сообщений через сигнал-слот,
А Вы уверены что разрешилась? Или просто "сейчас не падает"? Проверьте на всякий случай тип коннекта
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #11 : Март 29, 2010, 15:18 »

не, не разрешилась

причем если явно указывать Qt::QueuedConnection, то не работает вообще, выводится одна строка правильно, за ней некорректная, и все заканчивается

а по умолчанию похоже связывает через Qt::DirectConnection, потом не падает, но не успевает выводить целиком все строки (QTextEdit)


и хоть бы где было написано, что run() еще раз вызывается в start()...  Злой
« Последнее редактирование: Март 29, 2010, 15:32 от Гурман » Записан

2^7-1 == 127, задумайтесь...
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #12 : Март 29, 2010, 15:27 »

>>а по умолчанию похоже связывает через Qt::DirectConnection
нет не прямое, в асиситенте написан тип умалчиваемого соединения. Тут гадать не зачем
Записан

Юра.
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #13 : Март 29, 2010, 15:32 »

там написано, что по умолчанию Qt::QueuedConnection, но если его явно указать, то не работает, если попытаться QBlockingQueuedConnection, эффект точно такой же

а если через очередь, то почему не все строки успевают вставляться в QTextEdit?
Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Март 29, 2010, 16:01 »

там написано, что по умолчанию Qt::QueuedConnection, но если его явно указать, то не работает, если попытаться QBlockingQueuedConnection, эффект точно такой же
Перед вызовом connect вставьте тестовую печать thread() для объектов сигнал/слот чтобы посмотреть где они были созданы. Ну и вообще консоль смотрите, там Qt часто выводит полезную информацию
Записан
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.056 секунд. Запросов: 23.