Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: ecspertiza от Июля 07, 2009, 15:53



Название: 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 и QSqlQuery чёнить придумать но пока что тоже притормаживает.
QTableWidget и не пробуй! Тормоза будут гораздо больше!

Там и так данные в БД поступают в других потока поеэтому они и не мешают, а под обновлением таблици я подразумевал как раз этот самый 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
точно не помню но вроде нет...