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

Annule l'inscription d'un rappel de modification d'utilisateur inscrit précédemment.

## Syntaxe

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

### Paramètres

*token*   \_In\_\
Type : [XTaskQueueRegistrationToken](/fr-CA/reference/system/xtaskqueue/structs/xtaskqueueregistrationtoken)

Jeton retourné par [XUserRegisterForChangeEvent](/fr-CA/reference/system/xuser/functions/xuserregisterforchangeevent), qui identifie le rappel dont l'inscription doit être annulée.

*wait*   \_In\_\
Type : bool

Indique s'il faut bloquer jusqu'à ce que tous les rappels en attente soient terminés.

### Valeur de retour

Type : bool

Retourne false si wait est false et que l'annulation de l'inscription est en attente. Retourne true dans les autres cas.

## Remarques

<Note>Il n'est pas sécuritaire d'appeler cette fonction sur un thread sensible au temps. Pour plus d'informations, consultez [Threads sensibles au temps](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/console-dev/overviews/threads/time-sensitive-threads).</Note>

Annulation de l'inscription à une notification :

L'annulation de l'inscription retire le rappel associé au jeton de l'ensemble des rappels inscrits.

* Si aucun rappel n'est en cours d'exécution pour le jeton de rappel, l'appel retourne true.
* Si des rappels sont en cours d'exécution et que wait est true, l'appel bloque jusqu'à ce que le rappel en cours d'exécution se termine.
* Si des rappels sont en cours d'exécution et que wait est false, l'appel ne bloque pas, mais retourne false. Une fois le rappel associé au jeton terminé, l'inscription du jeton est automatiquement annulée.

Ce mécanisme permet les modèles de codage suivants :

1. Vous pouvez bloquer lors de l'annulation de l'inscription pour vous assurer que vos rappels ne sont jamais appelés après un appel d'annulation de l'inscription.
2. Vous pouvez choisir de ne pas bloquer. Si vous devez vous assurer que vos rappels sont terminés avant de supprimer des données, vous pouvez appeler périodiquement la fonction d'annulation de l'inscription avec false pour wait. Lorsqu'elle retourne enfin true, tous vos rappels sont terminés et vous pouvez supprimer l'état.
3. Si un appel d'annulation de l'inscription n'appelle pas le rappel, vous pouvez simplement passer false pour wait et ignorer la valeur de retour.

Pour inscrire un rappel de modification d'utilisateur, appelez [XUserRegisterForChangeEvent](/fr-CA/reference/system/xuser/functions/xuserregisterforchangeevent).
L'énumération [XUserChangeEvent](/fr-CA/reference/system/xuser/enums/xuserchangeevent) spécifie un type d'événement de modification.
[XUserChangeEventCallback](/fr-CA/reference/system/xuser/functions/xuserchangeeventcallback) est un rappel pour un événement de modification d'utilisateur.

L'exemple suivant montre comment gérer les événements de modification d'utilisateur.

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

## Configuration requise

**En-tête :** XUser.h

**Bibliothèque :** xgameruntime.lib

**Plateformes prises en charge :** Windows, Steam Deck, consoles de la famille XBOX One et consoles XBOX Series

## Documentation conceptuelle

* [Threads sensibles au temps](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/console-dev/overviews/threads/time-sensitive-threads)

## Voir aussi

[XUser](/fr-CA/reference/system/xuser/xuser_members)

[XUserRegisterForChangeEvent](/fr-CA/reference/system/xuser/functions/xuserregisterforchangeevent)

[XUserChangeEvent](/fr-CA/reference/system/xuser/enums/xuserchangeevent)

[XUserChangeEventCallback](/fr-CA/reference/system/xuser/functions/xuserchangeeventcallback)


## Related topics

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