ListView - как избежать мерцания (.NET / C #)? - PullRequest
1 голос
/ 01 июня 2009

Мое приложение является многопоточным, в нем содержится 25 активных потоков, и каждый поток переводит свой статус в список элементов списка делегатом.

пример:

    private delegate void SetBackColorDelegate(int index, Color color);
    private void SetBackColor(int index, Color color)
    {
        if (listView1.InvokeRequired)
        {
              listView1.Invoke(new SetBackColorDelegate(SetBackColor), new object[] { index, color });

        }
        else
        {
              listView1.Items[index].BackColor = color;
        }
    }

В зависимости от статуса он меняет цвет предмета и т. Д. И он очень часто мерцает, выглядит очень неприятно

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

Ответы [ 2 ]

2 голосов
/ 01 июня 2009

Пока жду вашего ответа на мой комментарий. Если мерцание является вопросом двойной буферизации, тогда принятый ответ на этот вопрос поможет вам в этом. Настройте свой просмотр списка, чтобы использовать стиль из ответа, и все готово. Это снижает производительность, поскольку гарантирует, что обновления цветов будут происходить только синхронно с частотой обновления монитора (обычно около 60 раз в секунду), но остановит щелчки / разрывы, возникающие при падении обновлений между обновлениями монитора. .

1 голос
/ 01 июня 2009

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

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

Я не знаю много о таймерах пользовательского интерфейса с точки зрения эффективности - возможно, такой таймер будет относительно дорогостоящим, поэтому вам может все равно понадобится некоторая связь между потоками: -UI поток включить таймер, если он еще не включен, и отключить его, когда вы делаете обновление. Таким образом, вы всегда будете на секунду отстать от реальности, но при этом будете обновлять только одно состояние в секунду.

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