Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Исключить частое оповещение GUI об изменениях 
:(
    Опции темы
Ruzzz
Дата 26.11.2009, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.3.2008

Репутация: нет
Всего: 1



Есть данные. Нужно чтобы на при их изменении обновлялось GUI. При этом данные изменяется по внешнему для приложения событию. Может быть как сотни изменений в секунду, так и одно в час. Задача при частом изменении, не оповещать каждый раз GUI, чтобы увеличить скорость приложения (не тратить ресурсы на обновление GUI).

Делаю с использованием таймера. При очередном изменении, запускаю таймер с интервалом 1 секунда, если же таймер уже запущен, то "обнуляю" его. Таймер дает команду GUI обновится и отключает себя. Таким образом GUI обновляется только через секунду после последнего изменения. Но. Здесь также тратиться ресурс, при каждом изменении данных, на работу с таймером.

Можно ли это делать эффективнее?

Это сообщение отредактировал(а) Ruzzz - 26.11.2009, 19:20
PM MAIL   Вверх
quarz
Дата 27.11.2009, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 7.1.2005

Репутация: нет
Всего: 3



Попробуй первый способ, когда гуи обновляется по внешнему событию, но с доработками. При каждой перерисовке делай проверку, сколько прошло времени с последнего обновления:

Код

if ((now() - t) < 1000) return;
t = now();
... обновление гуи


Добавлено через 14 минут и 3 секунды
мой вариант может провалиться, если два изменения произойдут быстро, а третье через большой промежуток времени. Тогда гуи обновится при 1м и 3м изменении, и второго мы так и не увидим.
PM MAIL   Вверх
Earnest
Дата 27.11.2009, 19:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Смотря на чем пишешь, и какие есть механизмы в твоей среде. Один из самых "экономных" вариантов - это инвалидация + холостой цикл. Т.е. при получение сообщения об изменении ставим флаг "все нужно обновить", но больше ничего не делаем. В холостом цикле проверяем этот флаг и, если надо, обновляем ГУИ и сбрасываем флаг. Смысл холостого цикла в том, что он один (или не один) раз срабатывает после каждого "освобождения" системы. Скажем, после очистки очереди вообщений (в Виндоус).  Если в среде нет холостого цикла, тогда его заменяет таймер, но тоже с установкой флага. Т.е. по таймеры проверяем флаг и обновляемся только при необходимости. Кстати, таймер много ресурсов не жрет, он обычно очень низкоприоритетный.


--------------------
...
PM   Вверх
Ruzzz
Дата 27.11.2009, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.3.2008

Репутация: нет
Всего: 1



Earnest,  пишу под винду, но хотелось бы универсальное решение, есть желание портировать прогу.

Про «холостой цикл» на базе таймера я думал, но так и не смог придумать нормальное решение. Далее я напишу подробно. Кроме таймера наверное только событие «отсутствие сообщений»? Или что вы имеете в виду? OnIdle в MFC или тоже в Delphi VCL? Но очередь вообщем то у меня и так при операциях не загрязняется smile да и охота контролировать процесс обновления. 

Про таймер. Думал сделать так: Таймер работает с частотой 1 сек. и проверяет флаг, если установлен то сбрасывает флаг и обновляет GUI, при любом изменении флаг устанавливается. Но у меня может быть ситуация когда в течении нескольких десятков секунд идет обработка данных, не хотелось бы чтобы в это время было обновление GUI.
PM MAIL   Вверх
Earnest
Дата 27.11.2009, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Ruzzz @  27.11.2009,  20:45 Найти цитируемый пост)
Кроме таймера наверное только событие «отсутствие сообщений»? Или что вы имеете в виду? OnIdle в MFC или тоже в Delphi VCL?

Типа того. Очередь - один из вариантов; просто как пример занятости программы.

Цитата(Ruzzz @  27.11.2009,  20:45 Найти цитируемый пост)
 Но у меня может быть ситуация когда в течении нескольких десятков секунд идет обработка данных, не хотелось бы чтобы в это время было обновление GUI.

Тогда еще один флаг "я занят, просьба не лезть с глупостями)"
Или, как вариант, вызов холостого цикла при завершении обработки. Холостой проход можно реализовать как угодно, хоть сообщением, хоть просто функцией - как удобнее.



--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


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

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




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


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

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