是否有可能/有必要在单独的线程中调用 OnDraw [MFC]
Posted
技术标签:
【中文标题】是否有可能/有必要在单独的线程中调用 OnDraw [MFC]【英文标题】:Is it possible/necessary to have call to OnDraw in separate thread [MFC] 【发布时间】:2016-01-12 16:06:22 【问题描述】:这是一个 MFC 文档/视图应用程序: 是否有可能/有必要在单独的执行线程(即工作线程)中调用 OnDraw?在我们构建的软件中,我们在 Doc/View 应用程序中的视图存在巨大问题。也就是说,每次滚动视图时,都会花费很长时间,以至于应用程序冻结。 需要处理的位图比较大(平均超过 1GB) 谢谢。
【问题讨论】:
您通常希望将那个巨大的位图分解成图块(例如,每个图块的大小大致适合屏幕),这样您一次最多可以使用 4 个图块,并且位图的其余部分保持不受干扰。 我可能会得到该位图的缩小副本,在滚动时显示粗略图像,在单独的线程中计算细节并在准备好时更新屏幕。 通常你应该把大图片分成几块,如上所述。至于您问题的“可能”部分,是的,可以创建一个用于绘图任务的线程。但我认为在大多数 Doc/View 应用程序中它是不必要的。如果绘图任务太繁重,你可能应该换成 Direct2D 等。 在工作线程中开始缩放活动并在缩放版本准备好之前跳过 OnDraw 中的更新是有意义的。一旦它是,您使视图无效并重新绘制它。准备好缩放版本后,您可以绘制所需的东西。 @Thereisnothingwecando:不。您的问题不在于渲染,而在于处理。 Direct2D 会减慢渲染速度(如果有的话)。 【参考方案1】:正如特别要求的那样,答案是“不”。 OnDraw 必须在主 GUI 线程的上下文中调用。你可以做的是:
将滚动区域标记为无效(在“OnScroll”中) 启动另一个线程以从过大的位图中提取屏幕大小的位图。 OnDraw 在无效区域上绘制大量问号。 后台线程在完成后向主 GUI 线程发送消息。 消息处理程序将滚动区域标记为现在具有支持位图(并再次调用“InvalidateRect”以提示另一个 OnDraw)。 OnDraw 只是将提取的位图就位。(但是将巨大的位图分成几块会更好。)
【讨论】:
以上是关于是否有可能/有必要在单独的线程中调用 OnDraw [MFC]的主要内容,如果未能解决你的问题,请参考以下文章