SDL2: Est-thread-safe SDL_GetMouseState ()?

voix
34

Est - SDL_GetMouseStatefil de fonction de sécurité?

Et dans l'exemple de SDL_GetMouseStatela SDL_PumpEvents, qui est connu pour être thread-dangereux, est utilisé. Si SDL_GetMouseStateest thread-safe, dois - je utiliser ce SDL_PumpEventsqui est thread-dangereux avec elle pour le faire fonctionner correctement?

Créé 25/01/2016 à 20:20
utilisateur
Dans d'autres langues...                            


1 réponses

voix
1

Le code de cette fonction est:

Uint32
SDL_GetMouseState(int *x, int *y)
{
    SDL_Mouse *mouse = SDL_GetMouse();

    if (x) {
        *x = mouse->x;
    }
    if (y) {
        *y = mouse->y;
    }
    return mouse->buttonstate;
}

Et SDL_GetMouseretourne simplement l' adresse de la variable statique globale. Par conséquent, il n'y a rien à risque avec elle, mais il n'y a pas atomicité.

Cependant les événements sont traités séparément. Si vous ne prcess pas les événements, la structure de la souris ne serait pas mise à jour et SDL_GetMouseStatevous donnera des valeurs dépassées. La documentation indique explicitement que vous devez appeler SDL_PumpEventsuniquement dans le thread graphique (celui qui initialisés système graphique).

Le pire scénario est en train de lire vous Vales de SDL_GetMouseStatetout autre thread met à jour. Vous pouvez lire ancienne valeur, la nouvelle valeur, ou même un mélange de deux (par exemple x de nouveau , mais y de l' ancien).

Créé 26/01/2016 à 02:18
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more