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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Ожидание сигнала  (Прочитано 13399 раз)
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #15 : Ноябрь 06, 2018, 15:07 »

Посмотрите как QFileSystemModel работает, она грузит астнхронно
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #16 : Ноябрь 06, 2018, 15:24 »

Ну если "асинхронно", то надо полагать что RestEventLoop выполняется в др нитке (не главной).
Не надо так полагать. Асинхронность и многопоточность это не связанные вещи, несмотря на то, что одно может быть реализовано используя другое.
« Последнее редактирование: Ноябрь 06, 2018, 21:37 от Old » Записан
Azazello
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #17 : Ноябрь 06, 2018, 16:05 »

Посмотрите как QFileSystemModel работает, она грузит астнхронно

Спасибо, но не поможет. Он грузит все данные без подкачки
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Ноябрь 07, 2018, 08:12 »

...это получение данных у нас асинхронно - мы не знаем когда данные прийдут, а могут прийти когда мы делаем ресайз, повторно ресайз (данные с первого), ковыряемся в носу и т.д.
Вот как работает мой старенький LLDB отладчик. Жму на треугольник expand/collapse чтобы увидеть члены структуры. Tреугольник реагирует (поворачивается), но никаких новых (child) айтемов (пока) нету. UI полностью свободно, можно ресайзить и.т.п. - все что угодно. Ну ладно, закурил, налил чайку и, всего лишь через минуту.. вот они, члены структуры, появились! Ну конечно так не всякий раз, но частенько.

Да, минусы очевидны "я нажал, а оно..". Однако если (как Вы утверждаете) момент приема данных неизвестен, то другого корректного решения нет.  Асинхронно - значит асинхронно, и нечего крутить лупы и замораживать UI чтобы из нее сделать синхронку.

Вывод: Дизайн MVC (в Qt) не предназначен для асинхронной загрузки данных.
Да, не получается - значит Qt виновато (ну а кто же еще?)  Улыбающийся
Записан
Azazello
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #19 : Ноябрь 07, 2018, 09:38 »

Да, не получается - значит Qt виновато (ну а кто же еще?)  Улыбающийся

Ну поговорим Улыбающийся. Начнем с того, что я не говорил, что у меня не получается, а говорил, что коробочный вариант Qt MVC не предусматривает асинхронную загрузку.

А с другой стороны, сколько, сколько раз (я не знаю, предполагаю) вы давали здесь советы - у вас неверная архитектура, пересмотрите её? Даже ваш последние топики посвещены переделу архитектуры.

Тогда получается, все, кто говорит про архитектуру изначально не прав. Ибо лукавит. Когда говорим про свою архитектуру - она может быть не правильна. Но Qt создавали боги, поэтому такое рассуждение кощунство. Или это из области -   дай мудрости не перепутать одно с другим? Но вопрос то стоит в другом - Qt:не трогай архитектуру, у тебя руки кривые. Свой проект - переделай архитектуру, у тебя руки кривые.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Ноябрь 07, 2018, 10:40 »

... Qt:не трогай архитектуру, у тебя руки кривые. Свой проект - переделай архитектуру, у тебя руки кривые.
Согласен, когда "слон слишком велик" - на него не лают. Хотя то же самое "в велосипедном исполнении" будет охаяно немедленно. Такова человеческая природа, ничего не попишешь  Улыбающийся Однако все-таки вернемся к теме.

..я не говорил, что у меня не получается, а говорил, что коробочный вариант Qt MVC не предусматривает асинхронную загрузку.
Хмм... не понял, а что в данном конкретном случае он должен "предусматривать"? Какого чуда Вы ожидали "ис каропки"? Юзер давит бубочку  "expand" - UI должно ему "ответить ответ". Если "достаточно быстрый" ответ невозможен - надо отпускать UI, т.е. выходить в событийный цикл, и показать юзеру что, мол, "процесс пошел". А потом, когда данные придут, по событию уже вставить строки.

А Вы что? Из обработчика одного события зовете др события - верный способ нарваться на неприятности, и Вам это прекрасно известно. Так что все верно - у Вас "архитектура кривая"  Улыбающийся


Записан
Azazello
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #21 : Ноябрь 07, 2018, 11:29 »

Хмм... не понял, а что в данном конкретном случае он должен "предусматривать"? Какого чуда Вы ожидали "ис каропки"? Юзер давит бубочку  "expand" - UI должно ему "ответить ответ". Если "достаточно быстрый" ответ невозможен - надо отпускать UI, т.е. выходить в событийный цикл, и показать юзеру что, мол, "процесс пошел". А потом, когда данные придут, по событию уже вставить строки.

А Вы что? Из обработчика одного события зовете др события - верный способ нарваться на неприятности, и Вам это прекрасно известно. Так что все верно - у Вас "архитектура кривая"  Улыбающийся

Давайте приведу пример конктетный. Будем брать для упрощения таблицу, а не дерево.

Итак, используется асинхронная модель с вью.
Вы смотрите данные и листаете их. Доходите до конца.
В случае синхронной модели: Пошел запрос, гуи ждет данные, появились, .отобразились.
В случае асинхонной модели: Пошел запрос. Данных ещё нет. А вы то листаете все равно -т.е. посылаете запросы. Пошел запрос, данных ещё нет. А вы все листаете. А вью смотрит не на те данные которые будут, а на банальный rowCount. И в определенный момент у вас появится не один пакет данных, а несколько, сколько вы там мышкой накляцали до 1-го прихода данных.

Конечно, в вашем дереве это не будет происходить, т.к. скорее вся ветка закачивается один раз и запрашивается только один раз.

Другой пример: resizeEvent. Как не создавай виджет, а два ресайза будет, и он 2 раза скажет fetchMore, потому что после первого fetchMore данные банально не успеют загрузится. Итог - два пакета данных при старте. Критично? Ну кому как. У меня сервер Rest считает эти запросы и каждый запрос имеет свою цену, причем не виртуальную, а которая считается.

Понятно, можно придумать много решений - все свои вью к примеру, которые смотрят на количество запрашиваемых данных.
А можно при запросе создавать "пустые" данные, которые будут заменятся на рабочие. Но это все так усложняет..... Это надо помечать что они пустые, чтобы не использовать их. А если их скачалось меньше чем ожидалось, удалять. ........ А в случае со сценой эти данные нужно куда то добавить, чтобы они были в сцене, но не отображались и не участвовали во всяких вычислениях..... А если рест сервер медленный или загнулся, то можно столько накляцать пустых данных, что мало не покажется. Тогда нужно ставить ограничения и пошло поехало........

« Последнее редактирование: Ноябрь 07, 2018, 11:44 от Azazello » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #22 : Ноябрь 07, 2018, 13:54 »

Лол, потому и нужна очередь.
Пришёл фетчмор - смотрим, мы уже запрашивали этот кусок? Нет, запрашиваем и кладём в очередь идентификатор индекса (в терминах ФС имя папки).
Папка прогрузилась, вставляем строки, убираем путь из очереди.
Боде, ну откройте код qfilesystemmode уже
Записан
Azazello
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #23 : Ноябрь 07, 2018, 15:24 »

Лол, потому и нужна очередь.
Пришёл фетчмор - смотрим, мы уже запрашивали этот кусок? Нет, запрашиваем и кладём в очередь идентификатор индекса (в терминах ФС имя папки).
Папка прогрузилась, вставляем строки, убираем путь из очереди.
Боде, ну откройте код qfilesystemmode уже

Так. Давайте закроем тему. А то меня не понимают, видно не стоит расширять вопросы, должны быть конкретные и не охватывать большУю область.
Блин. Еще раз повторюсь, qfilesystemmodel не делает подкачку данных, она их сразу ВСЕ скачивает. Да, он делает запрос на закачку ноды дерева, но ВСЕЙ ноды.
Я же вам говорю про другую подчкачку данных - в пределах таблицы, или в пределах одной ноды дерева. Как в QtSQL. Если база данных поддерживает курсор, SqlModel скачает первые 256 записей. Когда вы наступите на 256-ю, он закачает следущие 256. Где там в qfilesystemmodel - скачать следующие файлы/папки по списку. Не,там запрос на все файлы в папке.

Мой пример: вы открыли youtube и ведете скрол вниз, у вас подтягиваются данные.
Ваш пример: вы открыли youtube и кляцнули на категорию, и у вас тоже подтягиваются данные.

Но есть нюанс Улыбающийся
https://pikabu.ru/story/anekdot_pro_nyuans__349792
« Последнее редактирование: Ноябрь 07, 2018, 16:25 от Azazello » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #24 : Ноябрь 07, 2018, 16:37 »

Как делать заначку не всей годы разобрано в примере fetchMore, если мне память не изменчет
Записан
Azazello
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #25 : Ноябрь 07, 2018, 19:01 »

Как делать заначку не всей годы разобрано в примере fetchMore, если мне память не изменчет

Я так понял, вы сделали заначку. На все годы.... А потом память изменила и заначка пропала Улыбающийся)))))))))
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #26 : Ноябрь 08, 2018, 09:59 »

В случае синхронной модели:
В случае асинхонной модели:
Никто не спорит, синхронка куда проще и приятнее, как для программиста, так и для юзера. Но ее возможности ограничены. Напр источник данных может (надолго) застрять или вообще отвалиться.
Пошел запрос. Данных ещё нет. А вы то листаете все равно -т.е. посылаете запросы. Пошел запрос, данных ещё нет. А вы все листаете. А вью смотрит не на те данные которые будут, а на банальный rowCount. И в определенный момент у вас появится не один пакет данных, а несколько, сколько вы там мышкой накляцали до 1-го прихода данных.
Что здесь значит "листаете"? Если данных еще нет - как (или что) я могу листать? Видимо об этом Вы упоминаете дальше
А можно при запросе создавать "пустые" данные, которые будут заменятся на рабочие. Но это все так усложняет.....
Думаю это неудачная затея, такие пустышки станут "источником постоянных забот", лучше обойтись без них, сценарий Вы же и рассказали
Я же вам говорю про другую подчкачку данных - в пределах таблицы, или в пределах одной ноды дерева. Как в QtSQL. Если база данных поддерживает курсор, SqlModel скачает первые 256 записей. Когда вы наступите на 256-ю, он закачает следущие 256.
Возможно Вам просто не хватает уверенности начать эти переделки, издалека все кажется таким огромным  Улыбающийся
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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