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