Как пропустить обновление пользовательского интерфейса, если уже обновляется? - PullRequest
1 голос
/ 12 января 2011

[Извините, что английский не является моим родным языком.]

Итак, у меня есть пользовательский интерфейс и 1 рабочий в другом потоке, рабочий будет вызывать пользовательский интерфейс для Update () в случайном порядке, так чтобыть много Update () вызывается в пользовательском интерфейсе.Но если действительно многократное обновление (), то имеет смысл только самое последнее, но я не могу пропустить их между ними.

Так что я хочу

  1. "определить, если обновление продолжается (), если да, просто отложите еще 1 обновление ()"

  2. ", проверьте, есть ли еще 1 ожидающий обновления (), тогдаНет необходимости ждать больше »перед обновлением ()

Но я не уверен, каков наилучший способ сделать это.Я думаю, наверняка кто-то сталкивался с такой проблемой раньше.Поиск в Google просто дает мне какой-то несвязанный результат.Поэтому я ищу некоторые образцы или лучшие практики, поисковые термины, советы или предложения по этому поводу.

Большое спасибо

Ответы [ 3 ]

2 голосов
/ 12 января 2011

Не ясно, какую библиотеку классов вы используете. Однако вызов Update () в корне неверен. Окрашивание пользовательского интерфейса является задачей с низким приоритетом, ее следует выполнять только тогда, когда о более важных вещах не нужно заботиться.

Надлежащим способом является вызов Invalidate (). Вы можете вызывать его столько раз, сколько захотите, он не может «создать резервную копию». Когда поток пользовательского интерфейса будет готов и готов, он будет рисовать пользовательский интерфейс. Если изменения происходят быстрее, тогда поток пользовательского интерфейса может справиться с этим, тогда никакого вреда не будет, промежуточное рисование просто не произошло.

Что, в общем-то, вам нужно позаботиться. Довольно легко стрелять ногой и вызывать сотни раз в секунду. Что бессмысленно, человек не может воспринимать изменения так быстро. Сорок раз в секунду достаточно, это выглядит так же гладко, как кино в кино. Реально вы должны использовать меньше.

1 голос
/ 12 января 2011

Похоже, вам нужна очередь запросов на обновление длиной один.

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

0 голосов
/ 12 января 2011

Если вы всегда хотите гарантировать, что значение, полученное потоком пользовательского интерфейса, является последним добавленным, рассмотрите структуру стека для данных, которыми вы делитесь между пользовательским интерфейсом и фоновыми потоками. Вам все еще нужно будет заблокировать общие данные, чтобы гарантировать, что поток пользовательского интерфейса не получит «устаревшее» обновление.

Вот ссылка на класс Stack в C #:
http://msdn.microsoft.com/en-us/library/system.collections.stack.aspx

Согласно документации:

Безопасность потока
Публичная статика (Shared в Visual Basic) члены этого типа потокобезопасны. Любые члены экземпляра не гарантированно безопасен для потоков.

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

Перечисление через коллекцию по сути не потокобезопасный процедура. Даже когда коллекция синхронизированы, другие потоки все еще могут изменить коллекцию, которая вызывает перечислитель для исключения. Чтобы гарантировать безопасность нити во время перечисление, вы можете заблокировать Коллекция в течение всего Перечисление или ловить исключения в результате изменений, сделанных другими резьб.

EDIT:
Хорхе прав - есть также класс Queue, который мог бы лучше подойти:
http://msdn.microsoft.com/en-us/library/system.collections.queue.aspx

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