2009-06-01 11 views
1

내 응용 프로그램이 f.ex 25 개의 활성 스레드를 가진 다중 스레드이며, 각 스레드는 상태를 대리인에 의해 목록보기 항목으로 푸시합니다.ListView - 깜박임을 피하는 방법 (.NET/C#)?

예 : 당신이이 문제를 방지하는 방법을 제안 할 수 있습니다 어쩌면 :)

매우 불쾌한 보이는,

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; 
     } 
    } 

은 상태에 따라이 항목의 색상 등을 변경 그리고 그것은 많은 반짝인다? 그림을 빠르게 만드는 방법? 아니면 다른 구성 요소를 사용하기 시작해야할까요?

+0

나는 깜박임을 의미한다고 생각합니다. –

+0

문제를 약간 확장 할 수 있습니까? 항목의 색상을 변경하는 스레드가 많으며 색상이 많이 바뀌는 것이 문제입니까? 더블 버퍼링 문제와 같은 깜박임이나 빠르게 수행하지 못하는 색상 변경과 지속적으로 뒤떨어져 계속 유지하려고 시도 할 때 항상 색상이 변함을 의미합니까? 코드가 항목의 색상을 변경하도록 요청하고 색상이 변경되는 것이 왜 문제인지 이해할 수 없습니다. –

답변

2

내 의견에 대한 귀하의 답변을 기다리는 동안. 깜박임 인 경우 이중 버퍼링 문제가 발생하면 this question에서 허용되는 대답이 나옵니다. 응답에서 스타일을 사용하도록 목록보기를 설정하면 잘 할 수 있습니다. 컬러 업데이트는 모니터의 새로 고침 빈도 (일반적으로 초당 약 60 회)와 동기화되어 발생하지만 모니터 새로 고침 사이의 업데이트가 발생할 때 발생하는 깜박임/끊김 현상을 방지하므로 성능상의 불이익이 있습니다 .

+0

감사합니다. 정말로 this http://stackoverflow.com/questions/76993/how-to-double-buffer-net-controls-on -a-form이 나를 도왔다. :) –

1

각 스레드가 상태를 공유 데이터 구조로 푸시 한 다음 타이머를 사용하여 UI 스레드에서 초당 한 번 폴링하는 것이 좋습니다. 그 방법은 :

  • 당신은 비 UI 스레드에서 호출에 대해 걱정할 필요가 없습니다
  • 당신은 당신은 여전히 ​​합리적으로까지 간이 될거야 "중"UI
  • 을받지 않습니다
  • 날짜 ("내가 최근에 이미 업데이트 한 경우 업데이트하지 마라.)

효율성면에서 UI 타이머에 대해 많이 알지 못합니다. 그런 타이머는 상대적으로 비용이 많이들 것입니다 , 그래서 당신은 어쨌든 몇 가지 크로스 스레드 통신을해야 할 수도 있습니다 : 각각의 비 UI를 만들 t 이미 활성화되어 있지 않으면 타이머를 활성화하고 업데이트를 수행하면 타이머를 비활성화하십시오. 그렇게하면 항상 현실에 뒤지지 않지만 초당 상태 업데이트가 하나뿐입니다.

+0

네, 쉽게 할 수 있습니다. 하지만 나는 즉각적인 상태가 필요합니다.) 그것이 문제입니다. 나는 1 초마다 그 일을 할 수는 있지만, 할 수는 없습니다. –

+0

그러면 모순되는 요구 사항이있는 것 같습니다. 즉석에서 업데이트해야하고 표시 할 업데이트가 많으면 화면에 이러한 모든 업데이트가 표시되어 깜박 거리는 효과를냅니다. –

+0

(이게 실제로 버퍼링이 이중 인 경우 문제가 오해 한 것 같습니다.) –

관련 문제