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

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

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

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

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

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