Gdiplus是线程安全的吗?

时间:2009-11-12 15:20:41

标签: multithreading gdi+ thread-safety

我已经仔细阅读了MSDN文档,但我找不到某种方式的声明。我感兴趣的是:

  1. 我可以在一个线程上调用GdiplusStartup()然后在另一个线程上使用Gdiplus吗?或者我是否需要为每个线程调用GdiplusStartup()?
  2. 如果我在线程1上有一个Bitmap对象而在线程2上有不同的一个,那么它们是否可以同时调用Bitmap :: DrawImage(),还是需要添加锁定以确保序列化?
  3. 感谢。

2 个答案:

答案 0 :(得分:5)

问题2的部分答案,根据MSDN - Security Considerations: GDI+

  

线程同步

     

可能不止一个   线程可以访问单个GDI +   宾语。但是,GDI +没有提供   任何自动同步   机制。所以,如果你的两个线程   应用程序有一个指向相同的指针   GDI +对象,这是你的责任   同步对该对象的访问。

     

如果,某些GDI +方法会返回ObjectBusy   一个线程试图调用一个方法   而另一个线程正在执行   对同一个对象的方法。别去尝试   同步对象的访问   基于ObjectBusy返回值。   相反,每次访问一个成员   或调用对象的方法,放置   在关键部分内的呼叫,或   使用其他一些标准   同步技术。

答案 1 :(得分:3)

MSDN documentation状态'您可以在一个线程上调用GdiplusStartup并在另一个线程上调用GdiplusShutdown',这表示您只需要为您的进程调用一次GdiplusStartup()(并从任何线程使用它)

我不确定问题2.(我认为你的意思是你可以同时调用Graphics :: DrawImage(位图)吗?)你会在每个线程中创建一个不同的Graphics类,对吧?所以应该没有问题。