Предотвращение спама при рисовании элемента управления (во время значительного обновления древовидного списка, элементов управления списком) - PullRequest
1 голос
/ 29 июня 2009

У меня есть приложение, которое каждую секунду добавляет более 10 элементов в список. Это приводит к тому, что элемент управления и пользовательский интерфейс перестают отвечать на запросы, а иногда и не могут даже нарисовать его достаточно, а также потребляют много ресурсов ЦП.

Эти новые элементы поступают из разных потоков, поэтому я не могу использовать .BeginUpdate(), если я не выполняю какое-то локальное кэширование.

Если я выполняю BeginUpdate () и EndUpdate через фиксированные промежутки времени, тогда контроль застревает неокрашенным / пустым между интервалами.

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

Ответы [ 3 ]

3 голосов
/ 29 июня 2009

Поскольку новые элементы поступают из разных потоков, вам уже нужен Control.Invoke, вы можете с таким же успехом сделать это. Поэтому поместите ваши элементы в очередь и в опрос основного потока этой очереди (возможно, с использованием таймера) и добавьте пакет элементов в блок BeginUpdate / EndUpdate. Интервал таймера позволит вам настроить скорость отклика. Вам придется заблокировать очередь, но вам больше не нужен Invoke.

0 голосов
/ 01 июля 2009

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

Я полагаю, что добавление Application.DoEvents заставит ваше приложение реагировать так, как вы ожидаете. Кажется, проблема заключается в своевременной обработке сообщений Windows, а не в том, что делается.

Вам нужно будет вызвать основной поток, чтобы добавить элементы в элемент управления, поэтому не должно быть проблем с вызовом DoEvents несколько раз в секунду по мере прохождения. Это не будет чрезвычайно эффективным решением, но я думаю, что оно решит проблему отсутствия оперативности.

0 голосов
/ 29 июня 2009

Если у вас есть несколько потоков, добавляющих дополнения, они все равно должны быть перенаправлены в собственный поток элемента управления.

Таким образом, легко реализовать единый механизм дозирования после сортировки.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...