用于在MFC中将位图绘制为位图的线程类型

时间:2010-02-18 08:13:51

标签: c++ multithreading mfc gdi

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

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

所以有几个问题;

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

尽管问题可能与资源/锁定有关,但绘图线程有自己的提示CDC和CBitmap,它用于所有绘图,并且只有当位图通过a具有排他性访问时才将位图复制回主线程。互斥。代码也通过直接调用而不是单独的线程进行测试,以证明问题确实与线程有关。

2 个答案:

答案 0 :(得分:2)

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

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

你应该查看Raymond Chen关于这个主题的一系列帖子:

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

答案 1 :(得分:1)

Raymond Chen在他的博客上发布了这个消息:

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

(还有其他关于Windows对象的线程关联性的博客文章可能对您有帮助。)

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

希望有所帮助!