> ## 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

Cancela o registro de um retorno de chamada de alteração de usuário registrado anteriormente.

## Sintaxe

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

### Parâmetros

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

Um token retornado por [XUserRegisterForChangeEvent](/pt-BR/reference/system/xuser/functions/xuserregisterforchangeevent), que identifica o retorno de chamada cujo registro deve ser cancelado.

*wait*   \_In\_\
Tipo: bool

Indica se deve haver bloqueio até que todos os retornos de chamada pendentes sejam concluídos.

### Valor retornado

Tipo: bool

Retorna false se wait for false e o cancelamento do registro estiver pendente. Caso contrário, retorna true.

## Comentários

<Note>Não é seguro chamar esta função em um thread sensível ao tempo. Para obter mais informações, consulte [Threads sensíveis ao tempo](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/console-dev/overviews/threads/time-sensitive-threads).</Note>

Cancelando o registro de uma notificação:

O cancelamento do registro remove o retorno de chamada do token do conjunto de retornos de chamada registrados.

* Se os retornos de chamada não estiverem em execução para o token de retorno de chamada, a chamada retornará true.
* Se os retornos de chamada estiverem em execução e wait for true, a chamada será bloqueada até que o retorno de chamada em execução seja concluído.
* Se os retornos de chamada estiverem em execução e wait for false, a chamada não será bloqueada, mas retornará false. Depois que o retorno de chamada do token for concluído, o registro do token será cancelado automaticamente.

Esse mecanismo permite os seguintes padrões de codificação:

1. Você pode bloquear no cancelamento do registro para garantir que seus retornos de chamada nunca sejam invocados após uma chamada de cancelamento de registro.
2. Você pode optar por não bloquear. Se precisar garantir que seus retornos de chamada sejam concluídos antes de excluir dados, você poderá chamar periodicamente o cancelamento de registro com false para wait. Quando ele finalmente retornar true, todos os seus retornos de chamada estarão concluídos e você poderá excluir o estado.
3. Se uma chamada de cancelamento de registro não invocar o retorno de chamada, você poderá simplesmente passar false para wait e ignorar o valor retornado.

Para registrar um retorno de chamada de alteração de usuário, chame [XUserRegisterForChangeEvent](/pt-BR/reference/system/xuser/functions/xuserregisterforchangeevent).
A enumeração [XUserChangeEvent](/pt-BR/reference/system/xuser/enums/xuserchangeevent) especifica um tipo de evento de alteração.
[XUserChangeEventCallback](/pt-BR/reference/system/xuser/functions/xuserchangeeventcallback) é um retorno de chamada para um evento de alteração de usuário.

O exemplo a seguir demonstra como manipular eventos de alteração de usuário.

```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

**Cabeçalho:** XUser.h

**Biblioteca:** xgameruntime.lib

**Plataformas compatíveis:** Windows, Steam Deck, consoles da família XBOX One e consoles XBOX Series

## Documentação conceitual

* [Threads sensíveis ao tempo](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/console-dev/overviews/threads/time-sensitive-threads)

## Confira também

[XUser](/pt-BR/reference/system/xuser/xuser_members)

[XUserRegisterForChangeEvent](/pt-BR/reference/system/xuser/functions/xuserregisterforchangeevent)

[XUserChangeEvent](/pt-BR/reference/system/xuser/enums/xuserchangeevent)

[XUserChangeEventCallback](/pt-BR/reference/system/xuser/functions/xuserchangeeventcallback)


## Related topics

- [XUserUnregisterForChangeEvent](/reference/system/xuser/functions/xuserunregisterforchangeevent.md)
- [XUserRegisterForChangeEvent](/reference/system/xuser/functions/xuserregisterforchangeevent.md)
