Re: Как организовать фильтр по временнОму периоду?
От: Lloyd Россия  
Дата: 19.09.10 15:19
Оценка:
Здравствуйте, dims12, Вы писали:

D>Организовать обмен можно двумя способами:


D>1) В рабочем потоке вызывать BeginInvoke и передавать через него информацию о проделанной работе


Наверное все-таки Control.Invoke?

D>2) В рабочем потоке обновлять переменную с информацией о проделанной работе, а в основном потоке периодически опрашивать эту переменную и обновлять индикацию. Естественно, переменную нужно защитить критической секцией.


Только не критической секцией, а lock-ом.

D>Оба эти метода работают плохо если рабочий поток обновляет информацию очень часто.


D>В первом случае очередь основного потока забивается бесчисленными сообщениями BeginInvoke, и GUI становится полумёртвым, так как остальные сообщения теряются в этой массе.


D>Во втором случае ситуация немного получше, но GUI так же подвисает, так как натыкается на (часто) залоченный объект. Естественно, если период обновления составляет около секунды, то это терпимо.


А не надо его лочить. Если у вас эта перевенная — просто ссылка, то чтение/запись — опреация атомарная.

D>Я пришёл к выводу, что наилучшим способом является третий:


D>3) Позволить рабочему потоку обновлять информацию сколь угодно часто, но лишь изредка (например, 1 раз в секунду) пропускать эти изменения в GUI. В этом случае задерживать выполнение рабочего потока (Invoke вместо BeginInvoke), а выполнение основного потока никогда не тормозить.


D>Для решения этой задачи подошёл бы класс "временнОго фильтра", который и осуществлял бы эту задачу. То есть, проглатывал бы вызовы функции если они следуют очень часто и исполнял бы только те, которые случились не ранее заданного времени после предыдущего.


D>Существует ли что-нибудь подобное в готовом виде?


Наверняка, что-то похожее есть в RxFramework.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.