今天终于找到了一种解决这个问题的方法,虽然不知道是不是最佳的。
由于上次最后尝试已经将程序改成了使用多线程,所以这次的修改也都是基于多线程的。开始时本来以为换成多线程后,消息循环在主线程里,这样是不会造成UI卡住的,但事实却不是如此,现在考虑这个问题,感觉应该是绘图线程中为了实现动画效果而用了while(1)这样类似的循环不停的更新client area,而这项操作比较耗CPU时间,在性能不太好的机器上,虽然多线程了,但CPU占用率过高导致了主线程内处理消息,更新UI的延迟,造成了滚动条卡的问题。从这个角度出发,决定采取限制绘图线程的循环频率,最后要做到只在主线程消息处理完成的情况下才放开绘图线程,于是加了个事件内核对象,绘图线程循环内上来就无限WaitForSingleObject,并在每次循环结束后ResetEvent,而SetEvent的操作放在Application->OnIdle里,每次idle的时候就置一次event,让绘图线程画,这样就可以做到TScrollBox内滚动条在画大图的时候不卡了。
最后还有1个遗留的小问题,为了加快绘图速度,所以根据scrollbox当前的可视区域对其内的image进行了clip,这样在滚动条更新后未能及时更新视图,导致变化的可视区部分会有一下短暂的黑色,也算是个小问题吧,不过估计这个问题应该不难解决,加上滚动条对应的消息处理就可以了。
博主友情提示:
如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用>>博主专用加密工具v3<<处理后发布,原文只有博主可以看到。