2013-02-12 5 views
0

Я перемещаю свой рендерер в другой поток. Во время этого процесса я делаю два вызова IDirect3D9 :: CreateDevice: 1. из «потока рендеринга» - для создания устройства рендеринга и его правильного изменения 2. из «основного потока» - здесь я ' m создание Null-устройства для компиляции шейдеров и т. д.многопоточный IDirect3DDevice9 :: CreateDevice freeze

Эти вызовы, конечно, могут перекрываться (выполняться одновременно), поэтому я синхронизую их с CriticalSection.

Проблема в том, что один из этих вызовов когда-либо замерзает. DirectX не бросает никаких предупреждений до того, как это происходит, поэтому я подозреваю, что существует внутренний тупик.

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

Так что мне не хватает? Может кто-нибудь, пожалуйста, скажите мне?

Спасибо, Паксаса

ответ

1

У меня есть только смутное воспоминание об этом, но:

  1. docs состояния «Любой призыв создать, релиз, или перезагрузить устройство должны быть сделан с использованием тех же нитей как оконная процедура окна фокусировки ».
  2. Как я помню, даже если вы попытаетесь создать устройство с использованием NULL HWND, внутри Direct3D пойдет и выкапывает один для вашего приложения.

Поэтому один из ваших потоков, несомненно, нарушает первый пункт.