Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: bixbit от Апрель 01, 2012, 16:07



Название: Работа с большой таблицей
Отправлено: bixbit от Апрель 01, 2012, 16:07
Имеется таблица (в среднем около милиона ячеек)
при работе в ее пределах программа виснет
всё что возможно вызывается через QtConcurrent::run(...);
Как ы что нужно оптимизировать чтоб программа не висла?


Название: Re: Работа с большой таблицей
Отправлено: V1KT0P от Апрель 01, 2012, 16:10
Имеется таблица (в среднем около милиона ячеек)
при работе в ее пределах программа виснет
всё что возможно вызывается через QtConcurrent::run(...);
Как ы что нужно оптимизировать чтоб программа не висла?
Вынести всю работу с таблицей в класс, очередь сигналов класса вынести в отдельный поток. Посылать задания классу сигналами и получать результат тоже сигналами.


Название: Re: Работа с большой таблицей
Отправлено: bixbit от Апрель 01, 2012, 16:24
Вынести всю работу с таблицей в класс, очередь сигналов класса вынести в отдельный поток. Посылать задания классу сигналами и получать результат тоже сигналами.
Таблица с самого начаба была в отдельном классе.
Из сигналов только контекстное меню которое в отдельном потоке (QtConcurrent) вызывает функцию для инициализации таблицы.
 
При этом GUI виснет при изменении размера окна, вызове контекстного меню и других манипуляциях с окном


Название: Re: Работа с большой таблицей
Отправлено: V1KT0P от Апрель 01, 2012, 16:28
Вынести всю работу с таблицей в класс, очередь сигналов класса вынести в отдельный поток. Посылать задания классу сигналами и получать результат тоже сигналами.
Таблица с самого начаба была в отдельном классе.
Из сигналов только контекстное меню которое в отдельном потоке (QtConcurrent) вызывает функцию для инициализации таблицы.
 
При этом GUI виснет при изменении размера окна, вызове контекстного меню и других манипуляциях с окном

Ну дык ты же не вынес обработчик сигналов в отдельный поток верно? Вынеси и не будет проблем.


Название: Re: Работа с большой таблицей
Отправлено: Авварон от Апрель 01, 2012, 16:58
Чем таблицу отображаешь?


Название: Re: Работа с большой таблицей
Отправлено: bixbit от Апрель 01, 2012, 17:07
Ну дык ты же не вынес обработчик сигналов в отдельный поток верно? Вынеси и не будет проблем.
можно подробнее? а то не сталкивался с таким

Чем таблицу отображаешь?
обычный QTableWidget


Название: Re: Работа с большой таблицей
Отправлено: V1KT0P от Апрель 01, 2012, 17:15
можно подробнее? а то не сталкивался с таким
Код
C++ (Qt)
QThread *thread = new QThread;
твой_класс.moveToThread(thread);
После этого работай с классом только через сигналы и вся работа класса больше не будет влиять на графический интерфейс.


Название: Re: Работа с большой таблицей
Отправлено: lit-uriy от Апрель 01, 2012, 18:19
>>обычный QTableWidget
он для этих объёмов данных не предназначен.
Изучай модель/представление


Название: Re: Работа с большой таблицей
Отправлено: Авварон от Апрель 01, 2012, 20:12
lit-uriy
Да тейбл вью тоже сдохнет...


Название: Re: Работа с большой таблицей
Отправлено: Syveren от Апрель 02, 2012, 09:44
Можно написать свою модель (хранит только значения первичных ключей), которая в методе data делает запрос в БД и вовращает только нужные значения.
Разумеется лучше заранее определять первую и последнюю видимую строку и  кешировать видимые  данные (так будет быстрее). Я так делал для большого списка... с таблицей будет по труднее.


Название: Re: Работа с большой таблицей
Отправлено: interv от Апрель 09, 2012, 13:01
при работе в ее пределах программа виснет
Ты изменяешь только ячейку, или все данные меняешь?
если, допустим, раз в 5 сек ты меняешь все данные то у таблички вроде есть слот который отрабатывает при изменении модели, у меня такая задача решалась дисконнектом этого слота и модели - изменение данных - коннект сигнала и слота.

Если интересует могу поискать.


Название: Re: Работа с большой таблицей
Отправлено: Bepec от Апрель 09, 2012, 13:28
to Авварон: При таблице в 10,000,000 строк и 25 колонок, заполненными рандомными данными программа даже не чешется. Точнее чешется по желанию пользователя, но не лагает.

(Мой первый смешной опыт с модель/вью и делегатами)

По теме:
TableWidget на такое не рассчитан. Используй Model-View, как советовал lit-uriy.

Если использовать Model-View, то миллион не будет для тебя пределом. :D