Название: QtGui и QThread Отправлено: ecspertiza от Июля 07, 2009, 15:53 Бъюсь уже пару дней, возможно ли на одном виджете создать две кнопки но одну в главном потоке а вторую в дочернем?
если есть примеры угостите пожалуйста :) Название: Re: QtGui и QThread Отправлено: SABROG от Июля 07, 2009, 15:57 По команде (сигналу, событию) из потока. При этом само создание кнопки будет происходить в GUIшном потоке.
Название: Re: QtGui и QThread Отправлено: pastor от Июля 07, 2009, 15:58 > возможно ли на одном виджете создать две кнопки но одну в главном потоке а вторую в дочернем?
нет нельзя. Все гуевые элементы должны находится в главном потоке (гуи поток). А вот действие которое висит на кнопке можно вынести во вторичный поток. Название: Re: QtGui и QThread Отправлено: Авварон от Июля 07, 2009, 16:07 блин, объясните мне тупому, что значит "создать объект в отдельном потоке". Разве объект - это не куча байтов в памяти, которая общая у всех потоков? А в каком потоке будет выполнен конструктор вообще по сути врядли должно нас волновать.
Название: Re: QtGui и QThread Отправлено: pastor от Июля 07, 2009, 16:10 А в каком потоке будет выполнен конструктор вообще по сути врядли должно нас волновать. Увы, но волновать должно. Почитай Thread Support in Qt в ассистанте Название: Re: QtGui и QThread Отправлено: Авварон от Июля 07, 2009, 16:15 я к тому что почему нам должно хотеться создавать гуевину не в главном потоке. как бы гуи отдельно, работа отдельно.
Название: Re: QtGui и QThread Отправлено: ecspertiza от Июля 07, 2009, 16:37 Пример про две кнопки довольно грубый просто хотелось узнать, возможно ли это, дело обстоит так.
Есть приложение, в котором работает куча дочерних потоков, они обновляют записи в БД SQLite. На главной форме есть таблица которая один раз в секунду шлёт запрос к базе для обновления данных, так вот при таком раскладе GUI начинает притормаживать довольнотоки заметно, если убрать обновление таблици то всё работает нормально. Я впринципе понимаю что можно воспользоваться сигналами и слотами, но вот мне интересно в каком месте у меня начинает тормозить ГУИ при посстоянный запрсах или при постояной перерисовке модели? только неговарите что я извращенец :) Название: Re: QtGui и QThread Отправлено: SABROG от Июля 07, 2009, 17:18 Посмотри своим профайлером.
Название: Re: QtGui и QThread Отправлено: ecspertiza от Июля 08, 2009, 11:37 Может вообще посоветуете что поумнее, а то меня данная схема самого неособо радует.
Название: Re: QtGui и QThread Отправлено: spectre71 от Июля 08, 2009, 11:47 Пример про две кнопки довольно грубый просто хотелось узнать, возможно ли это, дело обстоит так. Есть приложение, в котором работает куча дочерних потоков, они обновляют записи в БД SQLite. На главной форме есть таблица которая один раз в секунду шлёт запрос к базе для обновления данных, так вот при таком раскладе GUI начинает притормаживать довольнотоки заметно, если убрать обновление таблици то всё работает нормально. Я впринципе понимаю что можно воспользоваться сигналами и слотами, но вот мне интересно в каком месте у меня начинает тормозить ГУИ при посстоянный запрсах или при постояной перерисовке модели? только неговарите что я извращенец :) 1) Что у тебя за таблица, какой класс??? 2) Вынести обновления и запросы в другой поток, на завершения запроса послать сигнал таблице на обновление. Название: Re: QtGui и QThread Отправлено: Hordi от Июля 08, 2009, 11:53 А я бы тупо кидал QEvent-ы в основной поток, далее выбрасывал бы те, которые не вкладываются в таймер (например накопилось 3 сообщения на 1 секунду для отрисовки) при торможении ГУЯ...
Название: Re: QtGui и QThread Отправлено: ecspertiza от Июля 08, 2009, 12:02 Цитировать 1) Что у тебя за таблица, какой класс??? Я использовал QTavleView, задавал ему модель QSqlQueryModel, и в обновлении делал просто QSqlQueryModel::setQuery(...); Сейчас пробую с QTableWidget и QSqlQuery чёнить придумать но пока что тоже притормаживает. Цитировать 2) Вынести обновления и запросы в другой поток, на завершения запроса послать сигнал таблице на обновление. Там и так данные в БД поступают в других потока поеэтому они и не мешают, а под обновлением таблици я подразумевал как раз этот самый QSqlQueryModel::setQuery(...), или ты хочешь чтото другое сказать? Название: Re: QtGui и QThread Отправлено: spectre71 от Июля 08, 2009, 12:13 Я использовал QTavleView, задавал ему модель QSqlQueryModel, и в обновлении делал просто QSqlQueryModel::setQuery(...); QTableWidget и не пробуй! Тормоза будут гораздо больше!Сейчас пробую с QTableWidget и QSqlQuery чёнить придумать но пока что тоже притормаживает. Там и так данные в БД поступают в других потока поеэтому они и не мешают, а под обновлением таблици я подразумевал как раз этот самый QSqlQueryModel::setQuery(...), или ты хочешь чтото другое сказать? Возможно у тебя QSqlQueryModel::setQuery(...) тормозит обработка запроса, поскольку делается в главном потоке.Само обновление QTableView раз в секунду тормозить не должно. Возможно стоит вытащить QSqlQueryModel в другой поток, не забыв про синхронизацию. Или сделать свою модель, обрабатывать запросы и получать данные в другом потоке и устанавливать полученные данные в модель. Название: Re: QtGui и QThread Отправлено: ecspertiza от Июля 08, 2009, 14:09 Не знаю правильно ли я сделал, я создал поток в нём QSqlQueryModel в паблике, а при создании QTableView ссылаюсь на модель из потока, работает но недолго я понимаю что нужно синхронизировать но не совсем понимаю как, про потоки и синхронизацию читал не посылайте туда :) в потоке в том месте где идёт QSqlQueryModel::setQuery(...) стоят мьютексы но они не помогают, если угостите кодом или направите в нужную сторону буду признателен.
Название: Re: QtGui и QThread Отправлено: spectre71 от Июля 08, 2009, 14:49 Не знаю правильно ли я сделал, я создал поток в нём QSqlQueryModel в паблике, а при создании QTableView ссылаюсь на модель из потока, работает но недолго я понимаю что нужно синхронизировать но не совсем понимаю как, про потоки и синхронизацию читал не посылайте туда :) в потоке в том месте где идёт QSqlQueryModel::setQuery(...) стоят мьютексы но они не помогают, если угостите кодом или направите в нужную сторону буду признателен. Залезь в сорцы QSqlQueryModel::setQuery(), посмотри что и как там делается, может поможет. Название: Re: QtGui и QThread Отправлено: break от Июля 08, 2009, 17:53 Вообще то БД SQLite очень хреново поддерживает обращения нескольких пользователей - если у вас в одном потоке пишется в таблицу а в другом читается - то блокируется вся БД!!! То есть нельзя прочитать пока не дописалось... Если конечно я не напутал - по идее из-за этого я отказался от этой БД - когда читал доку по ней -может дело в этом???
Название: Re: QtGui и QThread Отправлено: Winstrol от Июля 09, 2009, 09:18 Может вообще посоветуете что поумнее, а то меня данная схема самого неособо радует. Записывает в БД только один поток. Вычислительные потоки дают команды на запись очновному через механизм сигналов/слотов. В многопоточном случае вызов слота другого потока влечет помещение специального события в очередь событий другого потока. Данный подход часто именуется message passing.Название: Re: QtGui и QThread Отправлено: ecspertiza от Июля 09, 2009, 09:49 break, спасибо, тоже решил больше доки почитать про Sqlite, видимо придется отказаться от SQLite, видимо буду юзать XML :)
Название: Re: QtGui и QThread Отправлено: break от Июля 09, 2009, 12:57 Можно Firebird попробовать - плагин Qt под него рабочий - БД простая, кросплатформенная, бесплатная. Кроме того ребята с этого форума написали уже улучшенный свой плангин на основе ibpp - где то по темам можно найти. Просто если в программе большая часть кода уже на SQL просто так отказаться - наверное много надо будет переписывать.
Вроде пока нету XML-SQL плагина для Qt. :-)(позволяющему работать с отдельными файлами XML как с таблицами через SQL запросы) В некоторых случаях был бы удобен... Название: Re: QtGui и QThread Отправлено: ecspertiza от Июля 09, 2009, 13:52 Firebird не подходит, хотелось бы сделать простое приложение, что бы пользователь не заморачивался с установкой сервера Firebird и драйверов, можно конечно это всё вшить в инсталятор, тока нафига эти панты нужны :) SQLite был выбран именно по этому что его базу можно запросто переносить и не заморачиваться, я думаю я особо не потеряю, у меня две процедуры пишут данные в БД правда в разных потоках, и одна считывает, тоесть мне написать класс для работы с XML и поправить 3 участка кода :)
Название: Re: QtGui и QThread Отправлено: ритт от Июля 09, 2009, 16:00 Firebird не подходит, хотелось бы сделать простое приложение, что бы пользователь не заморачивался с установкой сервера Firebird и драйверов, можно конечно это всё вшить в инсталятор, тока нафига эти панты нужны :) SQLite был выбран именно по этому что его базу можно запросто переносить и не заморачиваться, я думаю я особо не потеряю, у меня две процедуры пишут данные в БД правда в разных потоках, и одна считывает, тоесть мне написать класс для работы с XML и поправить 3 участка кода :) + межпотоковую синхронизацию реализоватьа какие проблемы с базами птица? Цитировать Можно Firebird попробовать - плагин Qt под него рабочий - БД простая, кросплатформенная, бесплатная. Кроме того ребята с этого форума написали уже улучшенный свой плангин на основе ibpp - где то по темам можно найти ребята с этого форума лишь выпросили этот плагин выложить под открытой лицензией :)мне лично не нужны чужие лавры ) Название: Re: QtGui и QThread Отправлено: ecspertiza от Июля 09, 2009, 16:05 Цитировать а какие проблемы с базами птица? Ну например если юзверь просто скопирует софтину на другую машину где нету огептицы, софтина незаконнектится к серверу :) Название: Re: QtGui и QThread Отправлено: ритт от Июля 09, 2009, 17:53 Цитировать а какие проблемы с базами птица? Ну например если юзверь просто скопирует софтину на другую машину где нету огептицы, софтина незаконнектится к серверу :) Название: Re: QtGui и QThread Отправлено: ecspertiza от Июля 09, 2009, 20:20 Цитировать как её это удастся, если птица встроенная будет? :) А можно по подробнее чёт я несовсем понимаю, насколько я знаю, при работе с огептицей нужно ставить серве, драйвера и т.д. в КуТе ещё и плагины тоскать, а чё значит встроенная это как? P.S. твой статус "Джедай : наставник для всех" ЖЖЁТ!!!))) :) Название: Re: QtGui и QThread Отправлено: ритт от Июля 09, 2009, 21:09 херасе...у меня почти 2К мессагов :)
берёшь http://downloads.sourceforge.net/firebird/Firebird-2.1.2.18118-0_Win32.zip, собираешь плугин в соответствии с советами в документации (либо собираешь другой плугин, читая ридми проекта http://code.google.com/p/qtfirebirdibppsqldriver/). всё собралось - замечательно. теперь качаешь http://downloads.sourceforge.net/firebird/Firebird-2.1.2.18118-0_Win32_embed.zip, читаешь doc/README_embedded.txt и делаешь как там написано. запускаешь, работаешь. Название: Re: QtGui и QThread Отправлено: ecspertiza от Июля 09, 2009, 21:25 Шикарно, попробую, +10 Константин :)
Название: Re: QtGui и QThread Отправлено: break от Июля 10, 2009, 01:48 Я в свое время пользовался FB Embedded для создания демо версии программы. Embedded Firebird не то что не нужно устанавливать и настраивать (длл только рядом с программой пооложить) - ее даже можно на CD диск записать и все будет работать прямо с диска. Собственное так и делал - правда тогда еще не на Qt.
Название: Re: QtGui и QThread Отправлено: ecspertiza от Июля 23, 2009, 11:14 А FB Embedded разве поддерживает несколько подключений?
Название: Re: QtGui и QThread Отправлено: break от Июля 23, 2009, 23:43 точно не помню но вроде нет...
|