|
|
|||||||||
|
|||||||||
|
|
QD3D 72 - QD3D はスレッドセーフではない(更新日: 97年 7 月 11 日)Q: 協調スレッドでレンダリングを行い、別のスレッドで他のことをさせています。レンダリングループの中で一時制御を渡すようにしていますが、レンダリングの長さにかかわらず、ループは一回しか実行されません。アドバイスをお願いします。 A: QuickDraw 3D の現バージョンは複数スレッドからの呼び出しに対応していません。したがって上記のようなことはおすすめできません。また、QuickDraw そのものもスレッド対応ではないため、何であれ描画を行うスレッドが 2 つ以上あるのは危険です。 しかしながら、あるスレッドで QD3D 処理を行い、別のスレッドではいっさい描画を行わないのであれば、ビューアイドルハンドラをインストールして、3D から制御を一時譲り渡すことができるはずです。私はスレッドアプリケーションでこれを試したことはありませんが、試してみることをおすすめします。 次に示すのは、ビューアイドルメソッドを定義してインストールするサンプルコードです。
TQ3Status MyIdleMethod(TQ3ViewObject view, const void *idleData);
TQ3Status MyIdleMethod(TQ3ViewObject view, const void *idleData)
{
TQ3Status returnResult = kQ3Success ;
/* ここで必要な処理を行う */
/*
* 注意: ここで時間のかかる処理を行うとレンダリング処理が終わりません。
*/
return returnResult ;
}
...
/* 上記で定義したアイドル関数をインストールする */
myStatus = Q3View_SetIdleMethod (gDocument.fView, MyIdleMethod, NULL);
...
アイドル関数を呼び出す回数は、ワイヤフレームレンダラーのほうが、インタラクティブレンダラーより多いことに注意してください。目的によってはこの方法が不十分かもしれませんので、まずは試してみてください。
---------------------------------------------------------------------------- -- Scott Kuechle devsupport@apple.com [ Technical Q&A's : Graphics & Media : QuickDraw 3D [QD3D] : : QD3D 72 ] |
|