gpt4 book ai didi

c++ - MFC中背景绘制到位图的线程类型

转载 作者:太空狗 更新时间:2023-10-29 21:30:38 24 4
gpt4 key购买 nike

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

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

那么几个问题;

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

虽然问题可能与资源/锁定相关,但绘图线程有自己的用于所有绘图的 provate CDC 和 CBitmap,并且只有在通过互斥体。该代码还通过直接调用而不是作为单独的线程进行了测试,以证明问题确实与线程有关。

最佳答案

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

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

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

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

关于c++ - MFC中背景绘制到位图的线程类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2287114/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com