MFC 中位图背景绘制的线程类型

2024-05-20

我有一个 MFC 文档/视图 C++ 图形应用程序,它将所有绘图都绘制到离屏位图,然后将其复制到 OnDraw 方法中提供的 CDC 指针。在过去的几天里,我一直在寻找将绘图组件放置在单独的工作线程中,这样它就不会停止 GUI。当我执行此操作时,我似乎会触发相当多的 MFC GDI 相关断言,例如,

VERIFY(::MoveToEx(m_hAttribDC, x, y, &point)

那么几个问题;

  • 在 MFC 和 GDI 中使用工作线程有什么问题吗?
  • 跨线程使用 MFC GDI 对象是否存在问题?
  • GDI 对象是否必须在线程本地声明?

虽然问题可能与资源/锁定相关,但绘图线程有自己的 CDC 和 CBitmap,用于所有绘图,并且仅当它通过互斥体具有独占访问权限时才将位图复制回主线程。该代码还通过直接调用而不是作为单独的线程进行了测试,以证明问题确实与线程有关。


设备上下文可以由任何线程使用(您唯一必须注意的是执行该操作的线程GetDC还应该打电话ReleaseDC),但本质上不是线程安全的。您必须确保在任何给定时间点只有一个调用者正在访问 DC,但从您所写的内容来看,您似乎已经解决了这一问题。

你是什​​么意思GDI 线程是否必须在线程本地声明?它们必须在同一线程中分配和释放,但可以在任何线程中创建/使用。再次强调,您有责任不要同时从两个线程使用此类资源。

您可能应该查看 Raymond Chen 关于该主题的一系列帖子:

  • 用户界面对象的线程关联,第 1 部分:窗口句柄 http://blogs.msdn.com/oldnewthing/archive/2005/10/10/479124.aspx
  • 用户界面对象的线程关联,第 2 部分:设备上下文 http://blogs.msdn.com/oldnewthing/archive/2005/10/11/479587.aspx
  • 用户界面对象的线程关联,第 3 部分:菜单、图标、光标和加速表 http://blogs.msdn.com/oldnewthing/archive/2005/10/12/480064.aspx
  • 用户界面对象的线程亲和力,第 4 部分:GDI 对象和有关亲和力的其他注释 http://blogs.msdn.com/oldnewthing/archive/2005/10/13/480569.aspx
  • 用户界面对象的线程关联,第 5 部分:对象清理 http://blogs.msdn.com/oldnewthing/archive/2005/10/14/481043.aspx

并确保不链接到 C/MFC 库的单线程版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MFC 中位图背景绘制的线程类型 的相关文章

随机推荐