Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Продвинутая машина состояний 
:(
    Опции темы
xvr
Дата 5.7.2010, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Earnest @ 5.7.2010,  09:26)
xvr, это все равно разновидность второго варианта. 

Не совсем. У semibug 2й вариант включает не только поток, но и 
Цитата

по таймеру в основном потоке проверяет завершение выполнение задачи, опрашивать (через критическую секцию) состояние прогресса и выводить на форму.
А вот это как раз и не совсем правильно - логику взаимодействия задает основной поток, а реализует эту логику - 2й поток. Более логично было бы отдать и то и другое одному и тому же потоку

Цитата

Так что semibug прав - вариантов всего 2 - разбить на кусочки или в поток, а как уж с этим потоком перемигиваться - дело десятое.
Можно и с отдельным потоком сделать полную ж... (*)  smile 
Так что 2й вариант распадается на несколько меньших подвариантов, и их тоже надо тщательно выбирать  smile 

PM MAIL   Вверх
Earnest
Дата 5.7.2010, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(xvr @  5.7.2010,  12:33 Найти цитируемый пост)
Так что 2й вариант распадается на несколько меньших подвариантов, и их тоже надо тщательно выбирать

Так никто и не спорит. И в первом случае тоже есть разные варианты обеспечения нормальной работы интерфейса.
Цитата(xvr @  5.7.2010,  12:33 Найти цитируемый пост)
А вот это как раз и не совсем правильно - логику взаимодействия задает основной поток, а реализует эту логику - 2й поток. Более логично было бы отдать и то и другое одному и тому же потоку

Не соглашусь, второму (рабочему) потоку должно быть глубоко по барабану, кто и как его прогресс отображает: может, я в двух окнах хочу это сделать (я, кстати, часто так и делаю). И не надо замусоривать (возможно) сложный алгоритм всякой ерундой типа рисования прогресса. UI - дело основного потока. Насчет того, запрашивать прогресс или пусть поток сообщает - не очень существенно, дело вкуса. 
Я понимаю, что тебе не нравится, что основной поток всякой фигней занимается (по таймеру в основном потоке проверяет завершение выполнение задачи), но это решаемо в смысле дизайна. Я, например, написала  специальный управляющий элемент (панель = прогресс + кнопка Стоп), который как совершенно отдельная сущность легко вставляется в любой диалог и требует буквально пары точек взаимодействия (получает хандл задачи и дальше сам с ней разбирается).


--------------------
...
PM   Вверх
xvr
Дата 5.7.2010, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Earnest @ 5.7.2010,  15:41)
Цитата(xvr @  5.7.2010,  12:33 Найти цитируемый пост)
А вот это как раз и не совсем правильно - логику взаимодействия задает основной поток, а реализует эту логику - 2й поток. Более логично было бы отдать и то и другое одному и тому же потоку

Не соглашусь, второму (рабочему) потоку должно быть глубоко по барабану, кто и как его прогресс отображает:

Про отображение речь не шла, речь шла об оповещении, что состояние изменилось.
Цитата

И не надо замусоривать (возможно) сложный алгоритм всякой ерундой типа рисования прогресса. UI - дело основного потока.
UI - да, дело основного потока, а вот извлечение информации для отображения нет. Это должен предоставить рабочий поток. UI может вообще не знать, где и как эта информация представлена
Цитата

Насчет того, запрашивать прогресс или пусть поток сообщает - не очень существенно, дело вкуса. 
Может быть существенно. Данные для отображения генерятся во 2м потоке, и доставлять их проще от источника (и именно в момент генерации) приемнику. Такая система доставки легко и непринужденно ложится на очередь сообщений Windows, и практически ничего за собой не тянет (в смысле объема кода). 
Доставка в противоположном направлении требует синхронизации, защиты разделяемых переменных, и возможно организации callback'ов из основного потока в 2й поток (для запросов) - это явно сложнее, чем один SendMessage
Цитата

Я понимаю, что тебе не нравится, что основной поток всякой фигней занимается (по таймеру в основном потоке проверяет завершение выполнение задачи), но это решаемо в смысле дизайна.
Это совершенно не нужная полумера - или отправлять сообщения 'по течению' (с помощью очереди сообщений Windows), или делать полноразмерную систему MVC. Тут же предлагается подход, удачно сочетающий недостатки обоих систем
Цитата

Я, например, написала  специальный управляющий элемент (панель = прогресс + кнопка Стоп), который как совершенно отдельная сущность легко вставляется в любой диалог и требует буквально пары точек взаимодействия (получает хандл задачи и дальше сам с ней разбирается).
Это уже MVC. Чрезвычайно гибкая и мощная система, но требует кода (как минимум того самого 'специальный управляющий элемент')

PM MAIL   Вверх
Earnest
Дата 5.7.2010, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(xvr @  5.7.2010,  17:27 Найти цитируемый пост)
, и доставлять их проще от источника (и именно в момент генерации) приемнику.

Опять не соглашусь. Иногда - да, так нормально. А иногда лучше основному потоку решать, когда запрашивать. Все зависит от задачи. Скажем, если основному потоку больше делать нечего, как сообщения принимать - ну пусть. 
А представь, что процесс одной перерисовки (я не про прогресс, конечно) весьма ресурсо-емкий. Тогда лучше основной поток сам соображает когда ему лучше обновиться.
Критическая секция - было бы о чем говорить, кроме того, для запроса прогресса можно обойтись Interlock-функциями. В общем, нельзя сказать, что одно решение абсолютно всегда лучше другого.
Цитата(xvr @  5.7.2010,  17:27 Найти цитируемый пост)
Это уже MVC.

Ну да, конечно, только кода там кот наплакал - идея-то простая. 



--------------------
...
PM   Вверх
xvr
Дата 5.7.2010, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Earnest @ 5.7.2010,  17:28)
Иногда - да, так нормально. А иногда лучше основному потоку решать, когда запрашивать. Все зависит от задачи.

В таком случае основной поток должен знать что то о рабочем потоке, в частности где у него лежит этот самый прогресс и как его достать. А это лишние логические связи в программе
Цитата

А представь, что процесс одной перерисовки (я не про прогресс, конечно) весьма ресурсо-емкий. Тогда лучше основной поток сам соображает когда ему лучше обновиться.
Основной поток может выгрести поступающие сообщения, пока они есть в очереди, и только потом обновится
Цитата

В общем, нельзя сказать, что одно решение абсолютно всегда лучше другого.
Абсолютно - конечно нет. Но если нет явных предпочтений и UI синхронизируемое обновление не является ПОЛНОСТЬЮ тривиальным, то лучше все же отправлять сообщения от рабочего потока. Ну или полный MVC
Цитата

Цитата(xvr @  5.7.2010,  17:27 Найти цитируемый пост)
Это уже MVC.

Ну да, конечно, только кода там кот наплакал - идея-то простая.
Кода не очень много, но он есть. И если нужно засинхронизировать отрисовку ТОЛЬКО прогресс бара и кнопок, то любой дополнительный код вполне может быть излишним smile

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0478 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.