2015-11-12 4 views
1

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

У меня есть другой раздел ниже этого, который является секцией «легенды» для временной линии. При наведении курсора на определенную легенду я прохожу через временную линию и устанавливаю все ненужные метки в visible = false, а соответствующие метки - visible. Это позволяет пользователю навешиваться над определенной меткой легенды и видеть, что она представлена ​​только на временной линии.

Extra Info Когда пользователь выходит из легенды (ярлык) парить, восстановить все линии (наклейки) на временной шкале в видимой. /Дополнительная информация

Все это работает очень хорошо, но некоторые из моих временных шкал имеют на них более 800 ярлыков (тонкие линии).

Интерфейс обновляется примерно через 3-5 секунд в этом случае, что является приемлемым, но CPU ДЕЙСТВИТЕЛЬНО борется за то, чтобы не отставать.

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

Как я действительно не хочу использовать doEvents() (не то, чтобы это действительно помогло .. Я пробовал), какие другие предложения вы можете предложить, чтобы дать процессору некоторое время для дыхания.

То, что я сделал до сих пор:

  1. Установите содержащую панель к невидимым до начала цикла, и виден, когда он завершает.
  2. Макет приостановки и возобновления не влияет на производительность, у меня были лучшие результаты с трюком видимости в пункте 1.
  3. Я уже повторно использую метки и не добавляю/удаляю их, когда я нужно показать их.
  4. Должен ли я выполнять threading.thread.sleep, всего несколько миллисекунд, после каждой итерации цикла? (Является ли это приемлемой практикой)
  5. Моя форма настроена на двойную буферизацию.
  6. Этикетки могут быть немного «тяжелыми», так как у них есть множество дополнительных свойств и функций/событий, которые я не использую. Есть ли лучшая альтернатива?

Мой код:

Private Sub label_hovered(appname As String) Handles myAwesomeViewLegend.labelHover 

     Try 

      blockPanel.Visible = False 

      For Each l As Label In blockPanel.Controls 
       If l.Text = appname Then 
        l.Visible = True 

       Else 
        l.Visible = False 
       End If 

      Next 

      blockPanel.Visible = True 

     Catch ex As Exception 
      Dim method_name As String = System.Reflection.MethodBase.GetCurrentMethod().Name 
      Dim method_class As String = System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName 
      MsgBox(ex.tostring & vbcrlf & vbcrlf & method_name & vbcrlf & vbcrlf & method_class) 
     End Try 
    End Sub 
+1

Вы пытались установить 'l.Visible = False' только когда' l.Visible = True'? То есть 'If ​​l.Visible Then l.Visible = False' –

+0

Я не пробовал, но большинство ярлыков (линий) устанавливаются в visible = false, при каждом запуске. Показанные ярлыки - это крошечный процент всего. Я также не упомянул, что я восстанавливаю все ярлыки до видимых, когда парит из легенды (метки). –

+0

Я буду выполнять ваше предложение, тем не менее, как мне нравится сохранять любой цикл процессора, который я могу. Благодарю. –

ответ

1

Я бы построить только видимые метки. Я думаю, что это плохая практика, создающая 800 ярлыков и переключая свойство Visibility.

Создайте отсортированный список со временем и проверьте, должно ли время быть видимым, вычисляя начальное и конечное время (окно). Создайте метки для (должно быть видно) раз.

+0

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

+0

Медленный сценарий - наихудший сценарий. Если вы выберете несколько дней, с большим количеством действий за каждый день. Для нормальной ежедневной работы он довольно отзывчив. Я стараюсь убирать его как можно больше на более высоких уровнях. –

Смежные вопросы