Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GDI+;和多线程_C++_Winapi_Mfc_Gdi+ - Fatal编程技术网

C++ GDI+;和多线程

C++ GDI+;和多线程,c++,winapi,mfc,gdi+,C++,Winapi,Mfc,Gdi+,根据我找到的所有信息,GDI+能够以多线程的方式使用,只是限制了GDI+对象不能同时从多个线程使用 我在C++ MFC Windows应用程序中遇到两个线程零星崩溃的问题(一个是启动时的启动窗口,另一个是主线程进行初始化)。崩溃是不可再现的,但有一个共同点:在调试器中程序停止时,这两个线程中至少有一个处于GDI+操作中 这里有人知道GDI+线程吗?最好使用“双缓冲区”机制为每个映射创建2个,逐个使用。也就是说,当背景线程在存储器DC B上绘制时,主窗口读取存储器DC A以进行显示,并且在绘制完成

根据我找到的所有信息,GDI+能够以多线程的方式使用,只是限制了GDI+对象不能同时从多个线程使用

我在C++ MFC Windows应用程序中遇到两个线程零星崩溃的问题(一个是启动时的启动窗口,另一个是主线程进行初始化)。崩溃是不可再现的,但有一个共同点:在调试器中程序停止时,这两个线程中至少有一个处于GDI+操作中

这里有人知道GDI+线程吗?

最好使用“双缓冲区”机制为每个映射创建2个,逐个使用。也就是说,当背景线程在存储器DC B上绘制时,主窗口读取存储器DC A以进行显示,并且在绘制完成时通知主线程。通知主线程后,A和B交换(显示B,A是下一个后台线程操作的对象)

关于:

您可以在一个线程上调用GdiplusStartup,在一个线程上调用GdiplusShutdown 另一个线程,只要您删除所有GDI+对象(或 在调用GdiplusShutdown之前,它们将超出范围)

该文档还包括一些其他用法。 它还提到了如何与GDI+一起使用动态数据交换(DDE):

如果要为应用程序初始化GDI+(通过调用 GdiplusStartup(在InitInstance函数中),必须抑制 GDI+后台线程


据我所知,GDI+在内部使用Windows Imaging组件。WIC是基于COM的。COM有严格的线程规则。我猜,
GdiplusStartup
GdiplusShutdown
在调用线程上初始化COM。如果我的猜测是准确的,您就不能在任意线程上调用GDI+函数。事实证明,我猜错了。在
GdiplusStartup
中没有调用
CoInitialize[Ex]
。尽管如此,GDI+对象经常拥有GDI对象。如果这恰好是一个设备上下文,那么您可以订阅。正如我所理解的,GdiPlusStartup将为所有线程调用一次。我肯定不会从两个线程访问任何DC或GDI+对象(因为它们都与不同的窗口相关联)。GDI对象与GDI+不同。是的,感谢您指出,我仍然建议OP使用“双缓冲区”。这是指多线程GDI绘图。我认为GDI的多线程功能非常清楚(只要我只使用一个线程中的一个DC或一个GDI对象,它就可以工作),但我的问题仍然是关于GDI+的问题。@DrakeWu MSFT:为什么我要抑制GDI+后台线程?@nic:这只适用于同时使用
CWinApp
和DDE(有文档记录)的情况. 如果您决定取消GDI+'后台线程,请详细说明您的责任。