Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Aplikacje Direct3D w trybie pełnoekranowym zapewniają uchwyt okna dla środowiska uruchomieniowego Direct3D. Okno jest podpięte przez czas działania. Oznacza to, że wszystkie komunikaty przekazane do procedury komunikatów okna aplikacji zostały najpierw zbadane przez własną procedurę obsługi komunikatów środowiska wykonawczego Direct3D.
Zmiany trybu wyświetlania mają wpływ na procedury pomocy technicznej wbudowane w bazowy system operacyjny. Gdy wystąpią zmiany trybu, system emituje kilka komunikatów do wszystkich aplikacji. W aplikacjach Direct3D komunikaty są odbierane w wątku procedury okna, który niekoniecznie jest tym samym wątkiem, który o nazwie IDirect3DDevice9::Reset lub IDirect3D9::CreateDevice (lub ostateczne wydanie IDirect3DDevice9, co może spowodować zmianę trybu wyświetlania). Środowisko wykonawcze Direct3D zarządza kilkoma krytycznymi sekcjami wewnętrznie. Ponieważ co najmniej jedna z tych sekcji krytycznych jest utrzymywana podczas przełączania trybu spowodowanego przez IDirect3DDevice9::Reset lub IDirect3D9::CreateDevice, te sekcje krytyczne są nadal aktywne, gdy aplikacja odbiera komunikaty okna związane z zmianą trybu.
Ten projekt ma pewne konsekwencje dla aplikacji wielowątkowych. W szczególności aplikacja musi zdecydowanie rozdzielić wątki obsługi komunikatów okna z wątków Direct3D. Aplikacja, która powoduje zmianę trybu w jednym wątku, ale w procedurze okna wykonuje wywołania Direct3D na innym wątku, jest zagrożona zakleszczeniem.
Z tych powodów interfejs Direct3D został zaprojektowany tak, aby metody IDirect3DDevice9::Reset, IDirect3D9::CreateDevice, IDirect3DDevice9::TestCooperativeLevel, lub ostateczne wydanie IDirect3DDevice9 można wywołać tylko z tego samego wątku, który obsługuje komunikaty okien.
Tematy pokrewne