Russian Qt Forum
Ноябрь 22, 2024, 23:02
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Ожидание сигнала
Страниц:
1
[
2
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Ожидание сигнала (Прочитано 13390 раз)
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Ожидание сигнала
«
Ответ #15 :
Ноябрь 06, 2018, 15:07 »
Посмотрите как QFileSystemModel работает, она грузит астнхронно
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Ожидание сигнала
«
Ответ #16 :
Ноябрь 06, 2018, 15:24 »
Цитата: Igors от Ноябрь 06, 2018, 13:45
Ну если "асинхронно", то надо полагать что RestEventLoop выполняется в др нитке (не главной).
Не надо так полагать. Асинхронность и многопоточность это не связанные вещи, несмотря на то, что одно может быть реализовано используя другое.
«
Последнее редактирование: Ноябрь 06, 2018, 21:37 от Old
»
Записан
Azazello
Самовар
Offline
Сообщений: 103
Re: Ожидание сигнала
«
Ответ #17 :
Ноябрь 06, 2018, 16:05 »
Цитата: Авварон от Ноябрь 06, 2018, 15:07
Посмотрите как QFileSystemModel работает, она грузит астнхронно
Спасибо, но не поможет. Он грузит все данные без подкачки
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Ожидание сигнала
«
Ответ #18 :
Ноябрь 07, 2018, 08:12 »
Цитата: Azazello от Ноябрь 06, 2018, 14:12
...это получение данных у нас асинхронно - мы не знаем когда данные прийдут, а могут прийти когда мы делаем ресайз, повторно ресайз (данные с первого), ковыряемся в носу и т.д.
Вот как работает мой старенький LLDB отладчик. Жму на треугольник expand/collapse чтобы увидеть члены структуры. Tреугольник реагирует (поворачивается), но никаких новых (child) айтемов (пока) нету. UI полностью свободно, можно ресайзить и.т.п. - все что угодно. Ну ладно, закурил, налил чайку и, всего лишь через минуту.. вот они, члены структуры, появились! Ну конечно так не всякий раз, но частенько.
Да, минусы очевидны "я нажал, а оно..". Однако если (как Вы утверждаете) момент приема данных неизвестен, то другого корректного решения нет. Асинхронно - значит асинхронно, и нечего крутить лупы и замораживать UI чтобы из нее сделать синхронку.
Цитата: Azazello от Ноябрь 06, 2018, 14:12
Вывод: Дизайн MVC (в Qt) не предназначен для асинхронной загрузки данных.
Да, не получается - значит Qt виновато (ну а кто же еще?)
Записан
Azazello
Самовар
Offline
Сообщений: 103
Re: Ожидание сигнала
«
Ответ #19 :
Ноябрь 07, 2018, 09:38 »
Цитата: Igors от Ноябрь 07, 2018, 08:12
Да, не получается - значит Qt виновато (ну а кто же еще?)
Ну поговорим
. Начнем с того, что я не говорил, что у меня не получается, а говорил, что коробочный вариант Qt MVC не предусматривает асинхронную загрузку.
А с другой стороны, сколько, сколько раз (я не знаю, предполагаю) вы давали здесь советы - у вас неверная архитектура, пересмотрите её? Даже ваш последние топики посвещены переделу архитектуры.
Тогда получается, все, кто говорит про архитектуру изначально не прав. Ибо лукавит. Когда говорим про свою архитектуру - она может быть не правильна. Но Qt создавали боги, поэтому такое рассуждение кощунство. Или это из области - дай мудрости не перепутать одно с другим? Но вопрос то стоит в другом - Qt:не трогай архитектуру, у тебя руки кривые. Свой проект - переделай архитектуру, у тебя руки кривые.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Ожидание сигнала
«
Ответ #20 :
Ноябрь 07, 2018, 10:40 »
Цитата: Azazello от Ноябрь 07, 2018, 09:38
... Qt:не трогай архитектуру, у тебя руки кривые. Свой проект - переделай архитектуру, у тебя руки кривые.
Согласен, когда "слон слишком велик" - на него не лают. Хотя то же самое "в велосипедном исполнении" будет охаяно немедленно. Такова человеческая природа, ничего не попишешь
Однако все-таки вернемся к теме.
Цитата: Azazello от Ноябрь 07, 2018, 09:38
..я не говорил, что у меня не получается, а говорил, что коробочный вариант Qt MVC не предусматривает асинхронную загрузку.
Хмм... не понял, а что в данном конкретном случае он должен "предусматривать"? Какого чуда Вы ожидали "ис каропки"? Юзер давит бубочку "expand" - UI должно ему "ответить ответ". Если "достаточно быстрый" ответ невозможен - надо отпускать UI, т.е. выходить в событийный цикл, и показать юзеру что, мол, "процесс пошел". А потом, когда данные придут, по событию уже вставить строки.
А Вы что? Из обработчика одного события зовете др события - верный способ нарваться на неприятности, и Вам это прекрасно известно. Так что все верно - у Вас "архитектура кривая"
Записан
Azazello
Самовар
Offline
Сообщений: 103
Re: Ожидание сигнала
«
Ответ #21 :
Ноябрь 07, 2018, 11:29 »
Цитата: Igors от Ноябрь 07, 2018, 10:40
Хмм... не понял, а что в данном конкретном случае он должен "предусматривать"? Какого чуда Вы ожидали "ис каропки"? Юзер давит бубочку "expand" - UI должно ему "ответить ответ". Если "достаточно быстрый" ответ невозможен - надо отпускать UI, т.е. выходить в событийный цикл, и показать юзеру что, мол, "процесс пошел". А потом, когда данные придут, по событию уже вставить строки.
А Вы что? Из обработчика одного события зовете др события - верный способ нарваться на неприятности, и Вам это прекрасно известно. Так что все верно - у Вас "архитектура кривая"
Давайте приведу пример конктетный. Будем брать для упрощения таблицу, а не дерево.
Итак, используется асинхронная модель с вью.
Вы смотрите данные и листаете их. Доходите до конца.
В случае синхронной модели: Пошел запрос, гуи ждет данные, появились, .отобразились.
В случае асинхонной модели: Пошел запрос. Данных ещё нет. А вы то листаете все равно -т.е. посылаете запросы. Пошел запрос, данных ещё нет. А вы все листаете. А вью смотрит не на те данные которые будут, а на банальный rowCount. И в определенный момент у вас появится не один пакет данных, а несколько, сколько вы там мышкой накляцали до 1-го прихода данных.
Конечно, в вашем дереве это не будет происходить, т.к. скорее вся ветка закачивается один раз и запрашивается только один раз.
Другой пример: resizeEvent. Как не создавай виджет, а два ресайза будет, и он 2 раза скажет fetchMore, потому что после первого fetchMore данные банально не успеют загрузится. Итог - два пакета данных при старте. Критично? Ну кому как. У меня сервер Rest считает эти запросы и каждый запрос имеет свою цену, причем не виртуальную, а которая считается.
Понятно, можно придумать много решений - все свои вью к примеру, которые смотрят на количество запрашиваемых данных.
А можно при запросе создавать "пустые" данные, которые будут заменятся на рабочие. Но это все так усложняет..... Это надо помечать что они пустые, чтобы не использовать их. А если их скачалось меньше чем ожидалось, удалять. ........ А в случае со сценой эти данные нужно куда то добавить, чтобы они были в сцене, но не отображались и не участвовали во всяких вычислениях..... А если рест сервер медленный или загнулся, то можно столько накляцать пустых данных, что мало не покажется. Тогда нужно ставить ограничения и пошло поехало........
«
Последнее редактирование: Ноябрь 07, 2018, 11:44 от Azazello
»
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Ожидание сигнала
«
Ответ #22 :
Ноябрь 07, 2018, 13:54 »
Лол, потому и нужна очередь.
Пришёл фетчмор - смотрим, мы уже запрашивали этот кусок? Нет, запрашиваем и кладём в очередь идентификатор индекса (в терминах ФС имя папки).
Папка прогрузилась, вставляем строки, убираем путь из очереди.
Боде, ну откройте код qfilesystemmode уже
Записан
Azazello
Самовар
Offline
Сообщений: 103
Re: Ожидание сигнала
«
Ответ #23 :
Ноябрь 07, 2018, 15:24 »
Цитата: Авварон от Ноябрь 07, 2018, 13:54
Лол, потому и нужна очередь.
Пришёл фетчмор - смотрим, мы уже запрашивали этот кусок? Нет, запрашиваем и кладём в очередь идентификатор индекса (в терминах ФС имя папки).
Папка прогрузилась, вставляем строки, убираем путь из очереди.
Боде, ну откройте код qfilesystemmode уже
Так. Давайте закроем тему. А то меня не понимают, видно не стоит расширять вопросы, должны быть конкретные и не охватывать большУю область.
Блин. Еще раз повторюсь, qfilesystemmodel не делает подкачку данных, она их сразу ВСЕ скачивает. Да, он делает запрос на закачку ноды дерева, но ВСЕЙ ноды.
Я же вам говорю про другую подчкачку данных - в пределах таблицы, или в пределах одной ноды дерева. Как в QtSQL. Если база данных поддерживает курсор, SqlModel скачает первые 256 записей. Когда вы наступите на 256-ю, он закачает следущие 256. Где там в qfilesystemmodel - скачать следующие файлы/папки по списку. Не,там запрос на все файлы в папке.
Мой пример: вы открыли youtube и ведете скрол вниз, у вас подтягиваются данные.
Ваш пример: вы открыли youtube и кляцнули на категорию, и у вас тоже подтягиваются данные.
Но есть нюанс
https://pikabu.ru/story/anekdot_pro_nyuans__349792
«
Последнее редактирование: Ноябрь 07, 2018, 16:25 от Azazello
»
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Ожидание сигнала
«
Ответ #24 :
Ноябрь 07, 2018, 16:37 »
Как делать заначку не всей годы разобрано в примере fetchMore, если мне память не изменчет
Записан
Azazello
Самовар
Offline
Сообщений: 103
Re: Ожидание сигнала
«
Ответ #25 :
Ноябрь 07, 2018, 19:01 »
Цитата: Авварон от Ноябрь 07, 2018, 16:37
Как делать заначку не всей годы разобрано в примере fetchMore, если мне память не изменчет
Я так понял, вы сделали заначку. На все годы.... А потом память изменила и заначка пропала
)))))))))
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Ожидание сигнала
«
Ответ #26 :
Ноябрь 08, 2018, 09:59 »
Цитата: Azazello от Ноябрь 07, 2018, 11:29
В случае синхронной модели:
В случае асинхонной модели:
Никто не спорит, синхронка куда проще и приятнее, как для программиста, так и для юзера. Но ее возможности ограничены. Напр источник данных может (надолго) застрять или вообще отвалиться.
Цитата: Azazello от Ноябрь 07, 2018, 11:29
Пошел запрос. Данных ещё нет. А вы то листаете все равно -т.е. посылаете запросы. Пошел запрос, данных ещё нет. А вы все листаете. А вью смотрит не на те данные которые будут, а на банальный rowCount. И в определенный момент у вас появится не один пакет данных, а несколько, сколько вы там мышкой накляцали до 1-го прихода данных.
Что здесь значит "листаете"? Если данных еще нет - как (или что) я могу листать? Видимо об этом Вы упоминаете дальше
Цитата: Azazello от Ноябрь 07, 2018, 11:29
А можно при запросе создавать "пустые" данные, которые будут заменятся на рабочие. Но это все так усложняет.....
Думаю это неудачная затея, такие пустышки станут "источником постоянных забот", лучше обойтись без них, сценарий Вы же и рассказали
Цитата: Azazello от Ноябрь 07, 2018, 15:24
Я же вам говорю про другую подчкачку данных - в пределах таблицы, или в пределах одной ноды дерева. Как в QtSQL. Если база данных поддерживает курсор, SqlModel скачает первые 256 записей. Когда вы наступите на 256-ю, он закачает следущие 256.
Возможно Вам просто не хватает уверенности начать эти переделки, издалека все кажется таким огромным
Записан
Страниц:
1
[
2
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
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 сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...