Russian Qt Forum
Ноябрь 25, 2024, 04:27
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Пользовательский интерфейс (GUI)
>
Работа с большой таблицей
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Работа с большой таблицей (Прочитано 6073 раз)
bixbit
Гость
Работа с большой таблицей
«
:
Апрель 01, 2012, 16:07 »
Имеется таблица (в среднем около милиона ячеек)
при работе в ее пределах программа виснет
всё что возможно вызывается через QtConcurrent::run(...);
Как ы что нужно оптимизировать чтоб программа не висла?
Записан
V1KT0P
Гость
Re: Работа с большой таблицей
«
Ответ #1 :
Апрель 01, 2012, 16:10 »
Цитата: bixbit от Апрель 01, 2012, 16:07
Имеется таблица (в среднем около милиона ячеек)
при работе в ее пределах программа виснет
всё что возможно вызывается через QtConcurrent::run(...);
Как ы что нужно оптимизировать чтоб программа не висла?
Вынести всю работу с таблицей в класс, очередь сигналов класса вынести в отдельный поток. Посылать задания классу сигналами и получать результат тоже сигналами.
Записан
bixbit
Гость
Re: Работа с большой таблицей
«
Ответ #2 :
Апрель 01, 2012, 16:24 »
Цитата: V1KT0P от Апрель 01, 2012, 16:10
Вынести всю работу с таблицей в класс, очередь сигналов класса вынести в отдельный поток. Посылать задания классу сигналами и получать результат тоже сигналами.
Таблица с самого начаба была в отдельном классе.
Из сигналов только контекстное меню которое в отдельном потоке (QtConcurrent) вызывает функцию для инициализации таблицы.
При этом GUI виснет при изменении размера окна, вызове контекстного меню и других манипуляциях с окном
Записан
V1KT0P
Гость
Re: Работа с большой таблицей
«
Ответ #3 :
Апрель 01, 2012, 16:28 »
Цитата: bixbit от Апрель 01, 2012, 16:24
Цитата: V1KT0P от Апрель 01, 2012, 16:10
Вынести всю работу с таблицей в класс, очередь сигналов класса вынести в отдельный поток. Посылать задания классу сигналами и получать результат тоже сигналами.
Таблица с самого начаба была в отдельном классе.
Из сигналов только контекстное меню которое в отдельном потоке (QtConcurrent) вызывает функцию для инициализации таблицы.
При этом GUI виснет при изменении размера окна, вызове контекстного меню и других манипуляциях с окном
Ну дык ты же не вынес обработчик сигналов в отдельный поток верно? Вынеси и не будет проблем.
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Работа с большой таблицей
«
Ответ #4 :
Апрель 01, 2012, 16:58 »
Чем таблицу отображаешь?
Записан
bixbit
Гость
Re: Работа с большой таблицей
«
Ответ #5 :
Апрель 01, 2012, 17:07 »
Цитата: V1KT0P от Апрель 01, 2012, 16:28
Ну дык ты же не вынес обработчик сигналов в отдельный поток верно? Вынеси и не будет проблем.
можно подробнее? а то не сталкивался с таким
Цитата: Авварон от Апрель 01, 2012, 16:58
Чем таблицу отображаешь?
обычный QTableWidget
«
Последнее редактирование: Апрель 01, 2012, 17:41 от bixbit
»
Записан
V1KT0P
Гость
Re: Работа с большой таблицей
«
Ответ #6 :
Апрель 01, 2012, 17:15 »
Цитата: bixbit от Апрель 01, 2012, 17:07
можно подробнее? а то не сталкивался с таким
Код
C++ (Qt)
QThread
*
thread
=
new
QThread
;
твой_класс.
moveToThread
(
thread
)
;
После этого работай с классом только через сигналы и вся работа класса больше не будет влиять на графический интерфейс.
Записан
lit-uriy
Джедай : наставник для всех
Offline
Сообщений: 3880
Re: Работа с большой таблицей
«
Ответ #7 :
Апрель 01, 2012, 18:19 »
>>обычный QTableWidget
он для этих объёмов данных не предназначен.
Изучай модель/представление
Записан
Юра.
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Работа с большой таблицей
«
Ответ #8 :
Апрель 01, 2012, 20:12 »
lit-uriy
Да тейбл вью тоже сдохнет...
Записан
Syveren
Гость
Re: Работа с большой таблицей
«
Ответ #9 :
Апрель 02, 2012, 09:44 »
Можно написать свою модель (хранит только значения первичных ключей), которая в методе data делает запрос в БД и вовращает только нужные значения.
Разумеется лучше заранее определять первую и последнюю видимую строку и кешировать видимые данные (так будет быстрее). Я так делал для большого списка... с таблицей будет по труднее.
«
Последнее редактирование: Апрель 02, 2012, 09:47 от Syveren
»
Записан
interv
Гость
Re: Работа с большой таблицей
«
Ответ #10 :
Апрель 09, 2012, 13:01 »
Цитата: bixbit от Апрель 01, 2012, 16:07
при работе в ее пределах программа виснет
Ты изменяешь только ячейку, или все данные меняешь?
если, допустим, раз в 5 сек ты меняешь все данные то у таблички вроде есть слот который отрабатывает при изменении модели, у меня такая задача решалась дисконнектом этого слота и модели - изменение данных - коннект сигнала и слота.
Если интересует могу поискать.
Записан
Bepec
Гость
Re: Работа с большой таблицей
«
Ответ #11 :
Апрель 09, 2012, 13:28 »
to Авварон: При таблице в 10,000,000 строк и 25 колонок, заполненными рандомными данными программа даже не чешется. Точнее чешется по желанию пользователя, но не лагает.
(Мой первый смешной опыт с модель/вью и делегатами)
По теме:
TableWidget на такое не рассчитан. Используй Model-View, как советовал lit-uriy.
Если использовать Model-View, то миллион не будет для тебя пределом.
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
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 сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...