2009-06-01 101 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

我認爲你的意思是閃爍。 – 2009-06-01 10:31:57

+0

你可以擴展一下這個問題嗎?你有很多線程改變項目的顏色,問題是顏色變化很大?你的意思是閃爍,就像是雙緩衝問題,或者你的顏色變化不夠快,而且顏色變化不停,而且顏色總是隨着顏色的變化而變化。我不明白爲什麼代碼請求改變項目顏色,然後顏色改變是一個問題。 – 2009-06-01 11:03:02

回答

2

雖然我等待您對我的評論的回覆。如果閃爍的雙緩衝問題,那麼從this question接受的答案將讓你的方式。設置你的列表視圖使用答案中的風格,你很好。這樣做會影響性能,因爲它可以確保顏色更新僅與顯示器的刷新頻率同步(通常每秒約60次),但它會停止更新在顯示器刷新之間發生的輕拂/撕裂。

1

考慮使每個線程將其狀態推送到某個共享數據結構,然後使用計時器從UI線程中每秒輪詢一次。這樣的話:

  • 你不必擔心從非UI線程調用
  • 你不會得到一個「忙」 UI
  • 你仍然是合理的了,TO-日期(VS說「的方法,如果我已經最近更新不更新)

我不知道很多關於UI計時器在效率方面 - 它可能是這樣的計時器會相對昂貴,所以你可能無論如何都需要有一些跨線程通信:使每個非UI t hread啓用定時器(如果它尚未啓用),並在更新時禁用它。這樣,你總是會落後於現實,但仍然只有每秒一次的狀態更新。

+0

是的,它可以很容易地完成。但我需要即時狀態;)這就是問題所在,我可以每一秒都做到這一點,但是我做不到。 – 2009-06-01 10:37:19