GDI + и многопоточность - PullRequest
       72

GDI + и многопоточность

0 голосов
/ 03 февраля 2020

После всей информации, которую я нашел, GDI + может использоваться многопоточным способом, с тем ограничением, что объект GDI + не должен использоваться из нескольких потоков одновременно.

У меня есть проблема сбоя sporadi c в двух потоках в моем приложении C ++ MF C Windows (одна заботится об окне spla sh во время запуска, другая - основной поток, выполняющий некоторые операции инициализации). Сбои не воспроизводимы, но имеют одну общую черту: по крайней мере один из этих обоих потоков находится в операции GDI + в момент остановки программы в отладчике.

Кто-нибудь здесь знает что-то о GDI + нарезание резьбы?

1 Ответ

1 голос
/ 04 февраля 2020

Лучше использовать механизм «двойной буфер» для создания 2 памяти D C с для каждой карты, используйте одну за другой. То есть главное окно считывает память D C A для отображения, в то время как фоновый поток dr aws в памяти D C B, и информирует основной поток о завершении рисования. После уведомления основного потока происходит обмен A и B (отображается B, а A является объектом следующей операции фонового потока).

About GdiplusStartup :

Вы можете вызвать GdiplusStartup в одном потоке и вызвать GdiplusShutdown в другом потоке, если только вы удалили все свои объекты GDI + (или удалили их go из области видимости) перед вызовом GdiplusShutdown.

Документ также включает в себя некоторые другие использования на нем. В нем также упоминается, как использовать динамический c обмен данными (DDE) с GDI +:

Если вы хотите инициализировать GDI + для своего приложения (вызывая GdiplusStartup в вашей функции InitInstance), вы должны подавить фоновый поток GDI +.

...