【问题标题】:Thread type for background drawing to a bitmap in MFCMFC中位图背景绘制的线程类型
【发布时间】:2011-01-18 05:31:29
【问题描述】:

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

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

那么几个问题;

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

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

【问题讨论】:

    标签: c++ multithreading mfc gdi


    【解决方案1】:

    Raymond Chen 在他的博客上发布了关于此的信息:

    http://blogs.msdn.com/oldnewthing/archive/2005/10/11/479587.aspx

    (还有其他关于 windows 对象的线程亲和性的博文可能对您有所帮助)。

    显然对于 DC,您需要在同一线程上执行 Get/Release。

    希望有帮助!

    【讨论】:

    • 谢谢,也是正确的答案。抱歉,我只能打勾,皮埃尔以微弱优势第一个到达那里。
    • @Shane:不用担心,只要你打勾!
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 感谢您的链接,设备上下文中的第二个已对我的问题进行了排序,不允许在不同线程中选择和释放 DC。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多