Тип потока для рисования фона в растровое изображение в MFC - PullRequest
3 голосов
/ 18 февраля 2010

У меня есть графическое приложение C ++ для документа / представления C ++, которое выполняет все свои рисунки в закадровом растровом изображении, а затем копирует их в предоставленный указатель CDC в методе OnDraw. В последние пару дней я пытался поместить компонент рисования в отдельный рабочий поток, чтобы он не останавливал работу графического интерфейса. Кажется, я получаю изрядное количество связанных с MFC GDI утверждений, когда я делаю это, например, g,

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

Итак, несколько вопросов;

  • Есть ли проблемы с использованием рабочих потоков с MFC & GDI?
  • Есть ли проблемы с использованием объектов MFC GDI в потоках?
  • Должны ли объекты GDI быть объявлены локально для потока?

Хотя возможно, что проблема связана с ресурсом / блокировкой, поток чертежа имеет свои собственные CDC и CBitmap для обеспечения, которые он использует для всего чертежа, и копирует растровое изображение обратно в основной поток, когда он имеет исключительный доступ через мьютекс. Код также был протестирован прямым вызовом, а не отдельным потоком, чтобы доказать, что проблема действительно связана с многопоточностью.

Ответы [ 2 ]

2 голосов
/ 18 февраля 2010

Контексты устройств могут использоваться любым потоком (единственное, о чем вы должны знать, это то, что поток, который сделал GetDC, должен также вызывать ReleaseDC), но по своей сути не является потокобезопасным. Вы должны убедиться, что только один абонент имеет доступ к контроллеру домена в любой момент времени, но вы, похоже, позаботились об этом, исходя из того, что вы пишете.

Что вы подразумеваете под Должен ли поток GDI быть объявлен локально в потоке ? Они должны быть размещены и освобождены в одном потоке, но они могут быть созданы / использованы в любом потоке. Еще раз, вы несете ответственность за то, чтобы не использовать такой ресурс из двух потоков одновременно.

Вероятно, вам следует проверить серию сообщений Раймонда Чена на эту тему:

и убедитесь, что вы не ссылаетесь на однопоточные версии библиотек C / MFC.

1 голос
/ 18 февраля 2010

Рэймонд Чен опубликовал об этом в своем блоге:

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

(Есть и другие сообщения в блоге о сходстве потоков с объектами Windows, которые могут быть вам полезны).

Очевидно, что для контроллеров домена вам нужно выполнить Get / Release в том же потоке.

Надеюсь, это поможет!

...