【发布时间】:2020-02-03 13:57:03
【问题描述】:
根据我找到的所有信息,GDI+ 能够以多线程方式使用,只是限制不能从多个线程同时使用 GDI+ 对象。
我的 C++ MFC Windows 应用程序中有两个线程偶尔崩溃的问题(一个在启动时关心启动窗口,另一个是主线程做一些初始化工作)。崩溃是不可重现的,但有一个共同点:当程序在调试器中停止时,这两个线程中至少有一个线程处于 GDI+ 操作中。
这里有人了解 GDI+ 线程吗?
【问题讨论】:
-
据我所知,GDI+ 在内部使用 Windows 映像组件。 WIC 基于 COM。 COM 有严格的线程规则。我猜
GdiplusStartup和GdiplusShutdown在调用线程上初始化COM。如果我的猜测是准确的,你不能在任意线程上调用 GDI+ 函数。 -
原来,我猜错了。在
GdiplusStartup中没有对CoInitialize[Ex]的呼叫。尽管如此,GDI+ 对象经常拥有 GDI 对象。如果这恰好是一个设备上下文,您订阅subtle thread affinity rules。 -
据我了解,GdiPlusStartup 将为所有线程调用一次。而且我绝对不会从两个线程访问任何 DC 或 GDI+ 对象(因为它们都关联到不同的窗口)。