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

Désinscrit un rappel de modification d'utilisateur précédemment inscrit.

## Syntaxe

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

### Paramètres

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

Jeton renvoyé par [XUserRegisterForChangeEvent](/fr/reference/system/xuser/functions/xuserregisterforchangeevent), qui identifie le rappel à désinscrire.

*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

Renvoie false si wait a la valeur false et que la désinscription est en attente. Renvoie true dans les autres cas.

## Remarques

<Note>Cette fonction ne peut pas être appelée en toute sécurité sur un thread à durée critique. Pour plus d'informations, consultez [Threads à durée critique](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/console-dev/overviews/threads/time-sensitive-threads).</Note>

Désinscription d'une notification :

La désinscription supprime 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 renvoie true.
* Si des rappels sont en cours d'exécution et que wait a la valeur true, l'appel bloque jusqu'à ce que le rappel en cours d'exécution soit terminé.
* Si des rappels sont en cours d'exécution et que wait a la valeur false, l'appel ne bloque pas mais renvoie false. Une fois le rappel associé au jeton terminé, le jeton est automatiquement désinscrit.

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

1. Vous pouvez bloquer lors de la désinscription pour garantir que vos rappels ne sont jamais invoqués après un appel de désinscription.
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 désinscription avec false pour wait. Lorsqu'elle renvoie enfin true, tous vos rappels sont terminés et vous pouvez supprimer l'état.
3. Si un appel de désinscription n'invoque 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/reference/system/xuser/functions/xuserregisterforchangeevent).
L'énumération [XUserChangeEvent](/fr/reference/system/xuser/enums/xuserchangeevent) spécifie un type d'événement de modification.
[XUserChangeEventCallback](/fr/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 à durée critique](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/console-dev/overviews/threads/time-sensitive-threads)

## Voir aussi

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

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

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

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


## Related topics

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