次の方法で共有


IDirect3DQuery9::GetData

クエリ対象のリソースをポーリングし、クエリの状態またはクエリの結果を取得します。クエリの詳細については、「クエリ (Direct3D 9)」を参照してください。

HRESULT 
GetData(
  void* pData,
  DWORD dwSize,
  DWORD dwGetDataFlags
);

パラメータ

  • pData
    クエリ データを含むバッファーへのポインターです。これは、ユーザーが割り当てる必要があります。pData を NULL にできるのは、dwSize が 0 の場合だけです。
  • dwSize
    pData 内のデータのバイト数。dwSize をゼロに設定すると、このメソッドを使用してリソースに対するポーリングを実行し、クエリの状態を取得できます。「解説」を参照してください。
  • dwGetDataFlags
    クエリの種類を指定するデータ フラグ。有効な値は、0 または D3DGETDATA_FLUSH です。ドライバーに対するバッチ クエリのフラッシュを防止するには 0 を指定し、それらをあえてフラッシュするには D3DGETDATA_FLUSH を指定します。独自の待機方法を使用するアプリケーションの場合、クエリの結果はドライバーがフラッシュを受け取るまで返されません。

戻り値

戻り型を見ると、クエリの状態がわかります (クエリ (Direct3D 9) を参照)。クエリ データが使用可能な場合は S_OK を、使用できない場合は S_FALSE を返します。これらは、メソッドが成功した場合の戻り値になります。D3DGETDATA_FLUSH の指定時にこのメソッドが失敗すると、戻り値が D3DERR_DEVICELOST になる場合があります。

解説 

クエリの状態のポーリング時にデバイスが喪失する場合があります。D3DGETDATA_FLUSH を指定すると、このメソッドはデバイスの喪失に対応して D3DERR_DEVICELOST を返します。そのため、アプリケーションでは、デバイスの喪失が原因でスレッドがポーリングを無限に実行する (クエリに応答できない) のを防止できます。

GetData 自体が時間の経過に伴って S_OK を最終的に返すものと期待し、GetData ( ... , 0 ) を呼び出すだけのコードをアプリケーションで記述してはいけません。これは、過去にアプリケーションで FLUSH フラグを指定して GetData を実行した場合にも当てはまります。次に例を示します。

// Enables an infinite loop:
while( pQuery->GetData( ... , 0 ) == S_FALSE ) ;

// Still enables an infinite loop:
pQuery->GetData( ... , D3DGETDATA_FLUSH );
while( pQuery->GetData( ... , 0 ) == S_FALSE ) ;

// Does not enable an infinite loop because eventually the command
// buffer will fill up and that will cause a flush to occur.
while( pQuery->GetData( ..., 0 ) == S_FALSE ) {
    pDevice->SetTexture(...);
    pDevice->Draw(...);
}

要件

ヘッダー: D3D9.h 宣言