> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# XUserUnregisterForChangeEvent

> XUserUnregisterForChangeEvent

# XUserUnregisterForChangeEvent

Anula el registro de una devolución de llamada de cambio de usuario registrada anteriormente.

## Sintaxis

```cpp theme={null}
bool XUserUnregisterForChangeEvent(  
         XTaskQueueRegistrationToken token,  
         bool wait  
)  
```

### Parámetros

*token*   \_In\_\
Tipo: [XTaskQueueRegistrationToken](/reference/system/xtaskqueue/structs/xtaskqueueregistrationtoken)

Un token que devuelve [XUserRegisterForChangeEvent](/reference/system/xuser/functions/xuserregisterforchangeevent) y que identifica la devolución de llamada cuyo registro se anulará.

*wait*   \_In\_\
Tipo: bool

Indica si se debe bloquear hasta que se completen las devoluciones de llamada pendientes.

### Valor devuelto

Tipo: bool

Devuelve false si wait es false y la anulación del registro está pendiente. De lo contrario, devuelve true.

## Comentarios

<Note>No es seguro llamar a esta función en un subproceso sensible al tiempo. Para obtener más información, consulte [Subprocesos sensibles al tiempo](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/console-dev/overviews/threads/time-sensitive-threads).</Note>

Anulación del registro de una notificación:

La anulación del registro quita la devolución de llamada del token del conjunto de devoluciones de llamada registradas.

* Si no se están ejecutando devoluciones de llamada para el token de devolución de llamada, la llamada devuelve true.
* Si se están ejecutando devoluciones de llamada y wait es true, la llamada se bloquea hasta que la devolución de llamada en ejecución se complete.
* Si se están ejecutando devoluciones de llamada y wait es false, la llamada no se bloquea, pero devuelve false. Una vez que la devolución de llamada del token se completa, el registro del token se anula automáticamente.

Este mecanismo permite los siguientes patrones de codificación:

1. Puede bloquear la anulación del registro para asegurarse de que las devoluciones de llamada nunca se invoquen después de una llamada de anulación del registro.
2. Puede optar por no bloquear. Si necesita asegurarse de que las devoluciones de llamada se completen antes de eliminar datos, puede llamar periódicamente a la anulación del registro con false para wait. Cuando finalmente devuelva true, todas las devoluciones de llamada habrán terminado y podrá eliminar el estado.
3. Si una llamada de anulación del registro no invoca la devolución de llamada, puede simplemente pasar false para wait e ignorar el valor devuelto.

Para registrar una devolución de llamada de cambio de usuario, llame a [XUserRegisterForChangeEvent](/reference/system/xuser/functions/xuserregisterforchangeevent).
La enumeración [XUserChangeEvent](/reference/system/xuser/enums/xuserchangeevent) especifica un tipo de evento de cambio.
[XUserChangeEventCallback](/reference/system/xuser/functions/xuserchangeeventcallback) es una devolución de llamada para un evento de cambio de usuario.

En el ejemplo siguiente se muestra cómo controlar los eventos de cambio de usuario.

```cpp theme={null}
HRESULT RegisterForChanges()
{
    RETURN_HR_IF(E_UNEXPECTED, _token.token != 0);
    RETURN_IF_FAILED(XUserRegisterForChangeEvent(
        _queue,
        this,
        UserChangeEventHandler,
        &_token));
    return S_OK;
}

void UnregisterForChanges()
{
    XUserUnregisterForChangeEvent(_token, false);
    _token.token = 0;
}

void UserChangeEventHandler(
    XUserLocalId userLocalId,
    XUserChangeEvent event)
{
    auto iter = std::find_if(
        _users.begin(),
        _users.end(),
        [&userLocalId](const User& candidate)
    {
        XUserLocalId candidateUserLocalId;
        XUserGetLocalId(candidate.Handle(), &candidateUserLocalId);
        return candidateUserLocalId == userLocalId;
    });

    // User not known
    if (iter == _users.end())
    {
        return;
    }

    auto handle = iter->Handle();

    // If a guest gets signed out, immediately close the handle
    bool isGuest;
    if (SUCCEEDED_LOG(XUserGetIsGuest(handle, &isGuest)) &&
        isGuest &&
        event == XUserChangeEvent::SignedOut)
    {
        _users.erase(iter);
    }

    if (event == XUserChangeEvent::SigningOut)
    {
        // Delay the user signing out just for fun
        XUserSignOutDeferralHandle deferral;
        if (SUCCEEDED_LOG(XUserGetSignOutDeferral(&deferral)))
        {
            // Hold the deferral for 5 seconds then close it
            std::thread completeDeferralThread(
                [deferral]()
            {
                std::this_thread::sleep_for(std::chrono::milliseconds(5000));
                XUserCloseSignOutDeferralHandle(deferral);
            });

            completeDeferralThread.detach();
        }
    }

    if (event == XUserChangeEvent::GamerPicture)
    {
        iter->LoadGamerPicAsync(_queue);
    }
}
```

## Requisitos

**Encabezado:** XUser.h

**Biblioteca:** xgameruntime.lib

**Plataformas compatibles:** Windows, Steam Deck, consolas de la familia XBOX One y consolas XBOX Series

## Documentación conceptual

* [Subprocesos sensibles al tiempo](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/console-dev/overviews/threads/time-sensitive-threads)

## Consulte también

[XUser](/reference/system/xuser/xuser_members)

[XUserRegisterForChangeEvent](/reference/system/xuser/functions/xuserregisterforchangeevent)

[XUserChangeEvent](/reference/system/xuser/enums/xuserchangeevent)

[XUserChangeEventCallback](/reference/system/xuser/functions/xuserchangeeventcallback)


## Related topics

- [XUserRegisterForChangeEvent](/es/reference/system/xuser/functions/xuserregisterforchangeevent.md)
- [XUserGetIsGuest](/es/reference/system/xuser/functions/xusergetisguest.md)
- [XTaskQueueRegistrationToken](/es/reference/system/xtaskqueue/structs/xtaskqueueregistrationtoken.md)
- [XUser](/es/reference/system/xuser/xuser_members.md)
- [Contenedores de API de C# de Unity para el GDK](/es/build/gdk-and-engines/unity/unity-api-wrappers.md)
