技術ノート:マルチスレッドにてDirectMusicなどを扱う
DirectMusicをはじめ、特定の処理を行う場合はあらかじめ
CoInitialize(NULL);
としてCOMの初期化を行い、最後には
CoUninitialize();
としてCOMを解放するが、これは スレッドごとに必要となる作業である。
つまりマルチスレッドでスレッドAとスレッドBで ともにDirectMusicに関する何らかの処理がしたいときは 主となるスレッドAでCoInitializeするだけでなく、 新たに作られたスレッドBの中でも CoInitializeを必要とする。
もしくは「_WIN32_DCOM」を定義した上でCoInitializeを
CoInitializeEx(NULL,COINIT_MULTITHREADED);
に置き換えても可。これならば一回の初期化で 複数のスレッドからDirectMusicの操作が可能である。
わかってしまえば明確なルールだが、 しばらくこれに気づかなくて苦労した。
|