Condividi tramite


Metodo IDirect3DDeviceManager9::LockDevice (dxva2api.h)

Concede al chiamante l'accesso esclusivo al dispositivo Direct3D.

Sintassi

HRESULT LockDevice(
  [in]  HANDLE           hDevice,
  [out] IDirect3DDevice9 **ppDevice,
  [in]  BOOL             fBlock
);

Parametri

[in] hDevice

Handle per il dispositivo Direct3D. Per ottenere l'handle del dispositivo, chiama IDirect3DDeviceManager9::OpenDeviceHandle.

[out] ppDevice

Riceve un puntatore all'interfaccia IDirect3DDevice9 del dispositivo.

[in] fBlock

Specifica se attendere il blocco del dispositivo. Se il dispositivo è già bloccato e questo parametro è TRUE, il metodo si blocca fino a quando il dispositivo non viene sbloccato. In caso contrario, se il dispositivo è bloccato e questo parametro è FALSE, il metodo restituisce immediatamente con il codice di errore DXVA2_E_VIDEO_DEVICE_LOCKED.

Valore restituito

Il metodo restituisce un valore HRESULT. I valori possibili includono, ma non sono limitati a, quelli indicati nella tabella seguente.

Codice restituito Descrizione
S_OK
Il metodo è riuscito.
DXVA2_E_NEW_VIDEO_DEVICE
L'handle del dispositivo non è valido.
DXVA2_E_NOT_INITIALIZED
La gestione dispositivi Direct3D non è stata inizializzata. Il proprietario del dispositivo deve chiamare IDirect3DDeviceManager9::ResetDevice.
DXVA2_E_VIDEO_DEVICE_LOCKED
Il dispositivo è bloccato e fBlock è FALSE.
E_HANDLE
L'handle specificato non è un handle del dispositivo Direct3D.

Commenti

Al termine dell'uso del dispositivo Direct3D, chiama IDirect3DDeviceManager9::UnlockDevice per sbloccare il dispositivo.

Se il metodo restituisce DXVA2_E_NEW_VIDEO_DEVICE, chiamare IDirect3DDeviceManager9::CloseDeviceHandle per chiudere l'handle e quindi chiamare nuovamente OpenDeviceHandle per ottenere un nuovo handle. Il metodo IDirect3DDeviceManager9::ResetDevice invalida tutti gli handle di dispositivo aperti.

Se fBlock è TRUE, questo metodo può potenzialmente causare deadlock. Ad esempio, si verifica un deadlock se un thread chiama LockDevice e quindi attende su un altro thread che chiama LockDevice. Inoltre, se un thread chiama LockDevice due volte senza chiamare UnlockDevice tra.

Esempio

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;
}

Requisiti

   
Client minimo supportato Windows Vista [solo app desktop]
Server minimo supportato Windows Server 2008 [solo app desktop]
Piattaforma di destinazione Windows
Intestazione dxva2api.h

Vedi anche

Gestione dispositivi Direct3D

IDirect3DDeviceManager9