ListView-如何避免闪烁(.NET/C#)?
我的应用程序是多线程的,它有f.ex25个活动线程,每个线程按委托将其状态推送到列表视图项 例如:ListView-如何避免闪烁(.NET/C#)?,c#,.net,user-interface,components,C#,.net,User Interface,Components,我的应用程序是多线程的,它有f.ex25个活动线程,每个线程按委托将其状态推送到列表视图项 例如: private delegate void SetBackColorDelegate(int index, Color color); private void SetBackColor(int index, Color color) { if (listView1.InvokeRequired) { listVi
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;
}
}
根据状态,它会改变物品的颜色等。它会闪烁很多,看起来非常讨厌:)
也许你可以建议如何避免这种情况?如何加速绘图?或者我应该考虑使用不同的组件, 考虑将每个线程都推到某个共享的数据结构,然后使用定时器从UI线程中查询每秒一次。这样:
- 您不必担心从非UI线程调用
- 你不会得到一个“忙碌”的用户界面
- 你仍然可以合理地了解最新情况(而不是说“如果我最近已经更新了,就不要更新”)
就效率而言,我对UI计时器了解不多——这种计时器可能会相对昂贵,因此您可能需要进行一些跨线程通信:如果尚未启用计时器,则让每个非UI线程启用计时器,并在更新时禁用它。这样,您将始终落后于现实,但仍然是每秒只有一次状态更新。我正在等待您对我的评论的回复。如果闪烁是一个双缓冲问题,那么接受的答案将让您上路。将您的listview设置为使用答案中的样式,这样做很好。这将导致性能损失,因为它将确保我们的更新只与显示器的刷新率同步(通常为每秒60次左右),但它会停止在显示器刷新之间进行更新时发生的闪烁/撕裂。我想你的意思是闪烁。你能进一步说明一下这个问题吗?你有许多线程在更改项目的颜色,问题是颜色变化很大?你的意思是闪烁,像双缓冲区问题,还是你的颜色变化太大anges的执行速度不够快,而且它总是落后,总是在试图跟上时改变颜色?我不明白为什么代码要求更改项目的颜色,然后颜色改变是一个问题。是的,这很容易做到。但我需要即时状态;)这是个问题,我可以每一秒都这样做,但我不能听起来你有矛盾的要求:如果你需要立即更新一些东西,并且你有很多更新要显示,那么屏幕将显示所有这些更新,产生闪烁的效果。(如果这真的只是双缓冲,那么我误解了问题-哎呀。)谢谢:)这实际上帮助了我:)