Bagikan melalui


Masalah multithreading (Direct3D 9)

Aplikasi Direct3D layar penuh menyediakan handel jendela ke runtime Direct3D. Jendela dikaitkan dengan durasi. Ini berarti bahwa semua pesan yang diteruskan ke prosedur pesan jendela aplikasi telah terlebih dahulu diperiksa oleh prosedur penanganan pesan waktu proses Direct3D sendiri.

Perubahan mode tampilan dipengaruhi oleh rutinitas dukungan yang dibangun ke dalam sistem operasi yang mendasar. Ketika perubahan mode terjadi, sistem menyiarkan beberapa pesan ke semua aplikasi. Dalam aplikasi Direct3D, pesan diterima pada utas prosedur jendela, yang belum tentu merupakan utas yang sama yang disebut IDirect3DDevice9::Reset atau IDirect3D9::CreateDevice (atau Rilis akhir IDirect3DDevice9, yang dapat menyebabkan perubahan mode tampilan). Run time Direct3D mempertahankan beberapa bagian penting secara internal. Karena setidaknya salah satu bagian penting ini ditahan di seluruh sakelar mode yang disebabkan oleh IDirect3DDevice9::Reset atau IDirect3D9::CreateDevice, bagian penting ini masih ditahan saat aplikasi menerima pesan jendela terkait perubahan mode.

Desain ini memiliki beberapa implikasi untuk aplikasi multithreaded. Secara khusus, aplikasi harus yakin untuk memisahkan utas penanganan pesan jendelanya dengan kuat dari utas Direct3D-nya. Aplikasi yang menyebabkan perubahan mode pada satu utas tetapi membuat panggilan Direct3D pada utas yang berbeda dalam prosedur jendelanya dalam bahaya kebuntuan.

Untuk alasan ini, Direct3D dirancang sehingga metode IDirect3DDevice9::Reset, IDirect3D9::CreateDevice, IDirect3DDevice9::TestCooperativeLevel, atau Rilis akhir IDirect3DDevice9 hanya dapat dipanggil dari utas yang sama yang menangani pesan jendela.

Tips Pemrograman