我有一个显示数据的所有者绘制控件。数据随时间而变化。我需要找到一种快速的方法来不断更新控件。
我尝试使用计时器,但问题是计时器单独运行最多每秒65帧。如果控制的绘画方法需要时间,则fps会变得非常低。
我尝试从控件的绘制方法请求更新(InvalidateRect),这样它每秒重新绘制控件数百次,但是UI的其余部分无法正常工作(例如按钮未更新,工具提示被冻结等。)
尽可能快地更新所有者绘制控件的正确方法是什么,仍然保持UI响应?
P上。 S.我需要这个才能使用GDI,因此我无法使用OpenGL / Direct3D来显示我的数据。
答案 0 :(得分:2)
如果要尽可能快地更新它,请运行不等待输入的消息循环。如果您继续处理消息,UI将保持响应,但是当没有任何消息时,您的控件将继续更新。
伪代码:
while (!fQuit)
{
while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
DispatchMessage(&msg);
RepaintControl();
}
根据控件的实现方式,“重绘”功能可能非常简单:
RedrawWindow(hwndControl, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW);
如果你发现这会让你的机器陷入太多困扰(虽然多核应该没问题)或者正在快速更新 ,你可以使用一个等待计时器来获得更高分辨率的更新虽然仍然有时控制。有关可等待计时器的详细信息,请参阅Using Waitable Timer Objects。