Поделиться через


Проблемы с многопоточностью (Direct3D 9)

Полноэкранные приложения Direct3D предоставляют дескриптор окна для времени выполнения Direct3D. Окно подключается к времени выполнения. Это означает, что все сообщения, передаваемые в процедуру сообщений окна приложения, сначала были проверены собственной процедурой обработки сообщений во время выполнения Direct3D.

На изменения режима отображения влияют подпрограммы поддержки, встроенные в базовую операционную систему. При изменении режима система передает несколько сообщений всем приложениям. В приложениях Direct3D сообщения получаются в потоке процедуры окна, который не обязательно является тем же потоком, который называется IDirect3DDevice9::Reset или IDirect3D9::CreateDevice (или окончательный выпуск IDirect3Device9, который может привести к изменению режима отображения). Во время выполнения Direct3D поддерживается несколько критически важных разделов. Поскольку по крайней мере один из этих критически важных разделов находится в переключении режима, вызванном IDirect3DDevice9::Reset или IDirect3D9::CreateDevice, эти критические разделы по-прежнему сохраняются, когда приложение получает сообщения о окне, связанного с изменением режима.

Эта конструкция имеет некоторые последствия для многопоточных приложений. В частности, приложение должно строго отделять потоки обработки сообщений окна от потоков Direct3D. Приложение, которое вызывает изменение режима в одном потоке, но выполняет вызовы Direct3D в другом потоке в своей процедуре окна, находится под угрозой взаимоблокировки.

По этим причинам Direct3D разработан таким образом, чтобы методы IDirect3DDevice9::Reset, IDirect3D9::CreateDevice, IDirect3Device9::TestCooperativeLevel или окончательный выпуск IDirect3DDevice9 можно вызывать только из того же потока, который обрабатывает сообщения окна.

Советы по программированию