2010-02-18 3 views
3

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

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

Так несколько вопросов;

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

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

ответ

2

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

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

Вы, вероятно, следует проверить серию сообщений от Raymond Chen по теме:

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

+0

Спасибо за ссылки, второй в контекстах устройств отсортировал мой вопрос, выбор и освобождение DC в разных потоках недопустим. –

1

Raymond Chen опубликовал об этом в своем блоге:

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

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

Очевидно, что для DCs вам нужно сделать Get/Release в той же теме.

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

+0

Спасибо, и правильный ответ тоже.Извините, я могу только отметить его, а Пьер первым попал туда по ширине волос. –

+0

@ Шейн: Не стоит беспокоиться, пока ты гадаешь! – 2010-02-18 15:40:56

 Смежные вопросы

  • Нет связанных вопросов^_^