Russian Qt Forum
Ноябрь 18, 2024, 10:01 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с большой таблицей  (Прочитано 6067 раз)
bixbit
Гость
« : Апрель 01, 2012, 16:07 »

Имеется таблица (в среднем около милиона ячеек)
при работе в ее пределах программа виснет
всё что возможно вызывается через QtConcurrent::run(...);
Как ы что нужно оптимизировать чтоб программа не висла?
Записан
V1KT0P
Гость
« Ответ #1 : Апрель 01, 2012, 16:10 »

Имеется таблица (в среднем около милиона ячеек)
при работе в ее пределах программа виснет
всё что возможно вызывается через QtConcurrent::run(...);
Как ы что нужно оптимизировать чтоб программа не висла?
Вынести всю работу с таблицей в класс, очередь сигналов класса вынести в отдельный поток. Посылать задания классу сигналами и получать результат тоже сигналами.
Записан
bixbit
Гость
« Ответ #2 : Апрель 01, 2012, 16:24 »

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

Вынести всю работу с таблицей в класс, очередь сигналов класса вынести в отдельный поток. Посылать задания классу сигналами и получать результат тоже сигналами.
Таблица с самого начаба была в отдельном классе.
Из сигналов только контекстное меню которое в отдельном потоке (QtConcurrent) вызывает функцию для инициализации таблицы.
 
При этом GUI виснет при изменении размера окна, вызове контекстного меню и других манипуляциях с окном

Ну дык ты же не вынес обработчик сигналов в отдельный поток верно? Вынеси и не будет проблем.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Апрель 01, 2012, 16:58 »

Чем таблицу отображаешь?
Записан
bixbit
Гость
« Ответ #5 : Апрель 01, 2012, 17:07 »

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

Чем таблицу отображаешь?
обычный QTableWidget
« Последнее редактирование: Апрель 01, 2012, 17:41 от bixbit » Записан
V1KT0P
Гость
« Ответ #6 : Апрель 01, 2012, 17:15 »

можно подробнее? а то не сталкивался с таким
Код
C++ (Qt)
QThread *thread = new QThread;
твой_класс.moveToThread(thread);
После этого работай с классом только через сигналы и вся работа класса больше не будет влиять на графический интерфейс.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #7 : Апрель 01, 2012, 18:19 »

>>обычный QTableWidget
он для этих объёмов данных не предназначен.
Изучай модель/представление
Записан

Юра.
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #8 : Апрель 01, 2012, 20:12 »

lit-uriy
Да тейбл вью тоже сдохнет...
Записан
Syveren
Гость
« Ответ #9 : Апрель 02, 2012, 09:44 »

Можно написать свою модель (хранит только значения первичных ключей), которая в методе data делает запрос в БД и вовращает только нужные значения.
Разумеется лучше заранее определять первую и последнюю видимую строку и  кешировать видимые  данные (так будет быстрее). Я так делал для большого списка... с таблицей будет по труднее.
« Последнее редактирование: Апрель 02, 2012, 09:47 от Syveren » Записан
interv
Гость
« Ответ #10 : Апрель 09, 2012, 13:01 »

при работе в ее пределах программа виснет
Ты изменяешь только ячейку, или все данные меняешь?
если, допустим, раз в 5 сек ты меняешь все данные то у таблички вроде есть слот который отрабатывает при изменении модели, у меня такая задача решалась дисконнектом этого слота и модели - изменение данных - коннект сигнала и слота.

Если интересует могу поискать.
Записан
Bepec
Гость
« Ответ #11 : Апрель 09, 2012, 13:28 »

to Авварон: При таблице в 10,000,000 строк и 25 колонок, заполненными рандомными данными программа даже не чешется. Точнее чешется по желанию пользователя, но не лагает.

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

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

Если использовать Model-View, то миллион не будет для тебя пределом. Веселый
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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