Método IDirect3DDeviceManager9::LockDevice (dxva2api.h)
Fornece ao chamador acesso exclusivo ao dispositivo Direct3D.
Sintaxe
HRESULT LockDevice(
[in] HANDLE hDevice,
[out] IDirect3DDevice9 **ppDevice,
[in] BOOL fBlock
);
Parâmetros
[in] hDevice
Um identificador para o dispositivo Direct3D. Para obter o identificador do dispositivo, chame IDirect3DDeviceManager9::OpenDeviceHandle.
[out] ppDevice
Recebe um ponteiro para a interface IDirect3DDevice9 do dispositivo.
[in] fBlock
Especifica se o bloqueio do dispositivo deve ser aguardado. Se o dispositivo já estiver bloqueado e esse parâmetro for TRUE, o método será bloqueado até que o dispositivo seja desbloqueado. Caso contrário, se o dispositivo estiver bloqueado e esse parâmetro for FALSE, o método retornará imediatamente com o código de erro DXVA2_E_VIDEO_DEVICE_LOCKED.
Valor retornado
O método retorna um HRESULT. Os possíveis valores incluem, mas sem limitação, aqueles na tabela a seguir.
Código de retorno | Descrição |
---|---|
|
O método foi bem-sucedido. |
|
O identificador do dispositivo é inválido. |
|
O gerenciador de dispositivos Direct3D não foi inicializado. O proprietário do dispositivo deve chamar IDirect3DDeviceManager9::ResetDevice. |
|
O dispositivo está bloqueado e fBlock é FALSE. |
|
O identificador especificado não é um identificador de dispositivo Direct3D. |
Comentários
Quando terminar de usar o dispositivo Direct3D, chame IDirect3DDeviceManager9::UnlockDevice para desbloquear o dispositivo.
Se o método retornar DXVA2_E_NEW_VIDEO_DEVICE, chame IDirect3DDeviceManager9::CloseDeviceHandle para fechar o identificador e, em seguida, chame OpenDeviceHandle novamente para obter um novo identificador. O método IDirect3DDeviceManager9::ResetDevice invalida todos os identificadores de dispositivo abertos.
Se fBlock for TRUE, esse método poderá potencialmente ficar em deadlock. Por exemplo, ele fará deadlock se um thread chamar LockDevice e aguardar em outro thread que chame LockDevice. Ele também será deadlock se um thread chamar LockDevice duas vezes sem chamar UnlockDevice entre eles.
Exemplos
HRESULT LockDevice(
IDirect3DDeviceManager9 *pDeviceManager,
BOOL fBlock,
IDirect3DDevice9 **ppDevice, // Receives a pointer to the device.
HANDLE *pHandle // Receives a device handle.
)
{
*pHandle = NULL;
*ppDevice = NULL;
HANDLE hDevice = 0;
HRESULT hr = pDeviceManager->OpenDeviceHandle(&hDevice);
if (SUCCEEDED(hr))
{
hr = pDeviceManager->LockDevice(hDevice, ppDevice, fBlock);
}
if (hr == DXVA2_E_NEW_VIDEO_DEVICE)
{
// Invalid device handle. Try to open a new device handle.
hr = pDeviceManager->CloseDeviceHandle(hDevice);
if (SUCCEEDED(hr))
{
hr = pDeviceManager->OpenDeviceHandle(&hDevice);
}
// Try to lock the device again.
if (SUCCEEDED(hr))
{
hr = pDeviceManager->LockDevice(hDevice, ppDevice, TRUE);
}
}
if (SUCCEEDED(hr))
{
*pHandle = hDevice;
}
return hr;
}
Requisitos
Cliente mínimo com suporte | Windows Vista [somente aplicativos da área de trabalho] |
Servidor mínimo com suporte | Windows Server 2008 [somente aplicativos da área de trabalho] |
Plataforma de Destino | Windows |
Cabeçalho | dxva2api.h |