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

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

Страниц: 1 [2] 3 4 5   Вниз
  Печать  
Автор Тема: Паттерн наблюдатель  (Прочитано 38010 раз)
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #15 : Апрель 08, 2016, 13:59 »

Та неужели? Вот Вы сказали магическое слово "сигнал", и, о чудо, весь ф-ционал волшебным образом появился!! Наверное так работают "Ваши" сигналы, о которых мне ничего не известно  Улыбающийся
Так работают любые "сигналы". Главное хорошо продумать: когда, где и с какими параметрами их вызывать.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #16 : Апрель 08, 2016, 16:02 »

Я только предложил не затачивать его интерфейс только для индикации процесса выполнения, а продумать более универсальное решение. Что сделать совсем не сложно.

Но зачем? И "универсальное" относительно чего?
Задача поставлена, по моему, ясно:

Цитировать
Есть класс по загрузке неких файлов, например. В нем есть сигнал, который информирует о проценте загрузке.

то есть единственное, что ожидает получатель - это сигнал вроде Done(int percent), где percent будет меняться от 0 до 100.

Если это делать через "обсервер" - то надо регистрировать соответствующий интерфейс для класса, который загружает файлы (чтобы знал, для кого вызывать Done). Если делать через сигнал-слот - то не надо. Достаточно будет emit Done(currentProgress). А кто и как будет реагировать на этот сигнал - дело десятое.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #17 : Апрель 08, 2016, 16:05 »

Достаточно будет emit Done(currentProgress). А кто и как будет реагировать на этот сигнал - дело десятое.
Как вы видите этого не достаточно для запрошенного Igors двухбарного диалога.
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #18 : Апрель 08, 2016, 18:08 »

то есть единственное, что ожидает получатель - это сигнал вроде Done(int percent), где percent будет меняться от 0 до 100.

Если это делать через "обсервер" - то надо регистрировать соответствующий интерфейс для класса, который загружает файлы (чтобы знал, для кого вызывать Done). Если делать через сигнал-слот - то не надо. Достаточно будет emit Done(currentProgress). А кто и как будет реагировать на этот сигнал - дело десятое.

А сигнал-слот на магии работает? Подмигивающий И внутри нет никакого аналога "обсервера"?
Записан

Пока сам не сделаешь...
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #19 : Апрель 08, 2016, 23:33 »

Достаточно будет emit Done(currentProgress). А кто и как будет реагировать на этот сигнал - дело десятое.
Как вы видите этого не достаточно для запрошенного Igors двухбарного диалога.


Я отвечал исходя из первоначальной задачи Подмигивающий
Хорошо... расширим сигнал Done до 2 параметров, 1 это общий процент, 2 это процент загрузки текущего файла...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #20 : Апрель 08, 2016, 23:36 »

Цитата: ViTech link=topic=30002.msg220823#msg220823
А сигнал-слот на магии работает? Подмигивающий И внутри нет никакого аналога "обсервера"?

В этом ифишка, что внутренняя реализация в этом случае не важна Подмигивающий
  Может там и модель с обсерверами внутри и сидит, но она используется неявно, и юзеру не обязательно про это думать.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #21 : Апрель 09, 2016, 08:04 »

Хорошо... расширим сигнал Done до 2 параметров, 1 это общий процент, 2 это процент загрузки текущего файла...
А какое имя у "текущего файла"?
Мы передали загрузчику файлов список имен. Как нам узнать какой файл он сейчас загружет?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Апрель 09, 2016, 10:01 »

А какое имя у "текущего файла"?
Мы передали загрузчику файлов список имен. Как нам узнать какой файл он сейчас загружет?
Загрузчик это прекрасно знает - на то он и загрузчик. А вот индикатор нет, поэтому загрузчик должен ему это передать. Также одной строкой обычно отделаться не удается, выплывает вторая типа "units". Напр прогресс может отображаться в %, Kb, Mb. Плюс число шагов.

По поводу настойчивого (мягко говоря) использования именно сигналов. В примере что я привел удачно обыгрываются деструкторы объявленных классов. Не нужно заботиться о connect. И вообще вызывающий может ничего не знать о Qt. Если же нужно QueuedСonnection, то его удобно реализовать в самих классах индикатора.

В этом ифишка, что внутренняя реализация в этом случае не важна Подмигивающий
Ах как приятно отбрыкнуться от всего, мол, "это несущественные детали реализации" Улыбающийся Только вот готовой этажерки что-то не видать, и придется ее рисовать самому. Так сказать, заняться "логикой гуя"  Улыбающийся
 
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #23 : Апрель 09, 2016, 10:16 »

А вот индикатор нет, поэтому загрузчик должен ему это передать.
Бинго. А в предложенных вами и Racheengel решениях, я этого что-то не наблюдаю. Улыбающийся

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

По поводу настойчивого (мягко говоря) использования именно сигналов. В примере что я привел удачно обыгрываются деструкторы объявленных классов. Не нужно заботиться о connect. И вообще вызывающий может ничего не знать о Qt. Если же нужно QueuedСonnection, то его удобно реализовать в самих классах индикатора.
А вы все продолжаете воспринимать "сигналы" как Qt-сигналы? Напрасно, не нужно так зашториваться. Улыбающийся
« Последнее редактирование: Апрель 09, 2016, 10:19 от Old » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #24 : Апрель 09, 2016, 10:39 »

А это избыточно. Мы работаем с файлами, поэтому размера в байтах будет достаточно, а зная общий размер и загруженный легко вычислить процент.
А для объектов (исчисляемых штуками) уже придется что-то менять? Узковато спланировано, я бы даже сказал - недальновидно Улыбающийся
Бинго. А в предложенных вами и Racheengel решениях, я этого что-то не наблюдаю.  Улыбающийся
Так посмотрите первый ответ
А вы все продолжаете воспринимать "сигналы" как Qt-сигналы? Напрасно, не нужно так зашториваться. Улыбающийся
"Зашориваться", грамотюй  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #25 : Апрель 09, 2016, 10:44 »

А для объектов (исчисляемых штуками) уже придется что-то менять? Узковато спланировано, я бы даже сказал - недальновидно Улыбающийся
Перечитайте мой вариант. Улыбающийся
Если пользователю нужно будет отображать прогресс пофайлово, ему достаточно подписаться на сигнал о завершении загрузки каждого файла.

Так посмотрите первый ответ
Смотрел. И судя по нему, вы не очень представляете, о чем мы говорим. Улыбающийся
У нас уже есть класс FileLoader:
Код
C++ (Qt)
class FileLoader
{
public:
   FileLoader( const string &dir );
 
   void    load( const string_list &names );   // Запускает асинхронный процесс загрузки файлов
};
 
Нам нужен удобный и универсальный механизм, что бы отслеживать процесс загрузки (для отображения диалога в том числе).
А как я буду использовать информацию о прогрессе (отображать бары или выводить в консоль) дело десятое.
Поэтому, реализация диалога отображения прогресса в данной теме не интересно никому. Улыбающийся

"Зашориваться", грамотюй  Улыбающийся
Ага. Когда по теме сказать нечего, начинаем придираться к словам. Ах этот интернет, он везде одинаковый. Улыбающийся
« Последнее редактирование: Апрель 09, 2016, 11:07 от Old » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #26 : Апрель 09, 2016, 18:29 »

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

В действительности все точно наоборот. Как только определено "что нужно отображалке" - ни одной проблемы с использованием не вижу. Выбора-то здесь нет, кому нужен индикатор - тот его и создает. Отработал - удаляет. Если индикатору нужна строка(и) - создающий и должен ее обеспечить. То же и со счетчиком прогресса. Это простой и ясный интерфейс, пришивать сюда рукав слот/сигнала ни к чему.

Зато хорошо спланировать сам прогресс (в том числе и UI) далеко не просто, и не такая уж рутинная работа как может показаться. Одним классом здесь не обойтись, нужно упр-е каждым индикатором. Добавляемые индикаторы нужно где-то хранить, как ни крути - выплывает еще класс типа Manager, возможно синглтон. Ну и разумеется используемые классы - совсем не UI, до конкретного QDialog там еще далеко. Тут есть о чем поговорить, но ..., согласен, это никому не интересно  Улыбающийся
Записан
Bepec
Гость
« Ответ #27 : Апрель 09, 2016, 19:09 »

Оо синглтон для индикаторов... А можно пояснение - нафига он сдался там?

PS ну просто фантастика на мой взгляд.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #28 : Апрель 09, 2016, 19:35 »

Оо синглтон для индикаторов... А можно пояснение - нафига он сдался там?
Уже пояснил - хотя бы потому что установки индикаторов надо где-то хранить.

PS ну просто фантастика на мой взгляд.
Ну вот нужно 2 (или более) индикаторов в 1 окне. Приплыли, попастись на QProgressDialog не удается. Начните делать, и, уверяю, фантастика очень быстро станет реальностью (суровой для Вас  Улыбающийся)
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #29 : Апрель 09, 2016, 21:20 »

Тут есть о чем поговорить, но ..., согласен, это никому не интересно  Улыбающийся
Так вы тему новую создайте и если кому-то будет интересно обсуждайте. Для чего в чужой теме обсуждать интересные для вас проблемы?
Хотя обсуждать там нечего, даже с диалогом с десятью барами. Все сводится к рутиному и скучному гую. А за сингетон, да в таком случае, нужно сразу в разносчика кофе переводить. Улыбающийся
« Последнее редактирование: Апрель 09, 2016, 21:31 от Old » Записан
Страниц: 1 [2] 3 4 5   Вверх
  Печать  
 
Перейти в:  


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