SDL2: É SDL_GetMouseState () thread-safe?

votos
34

É SDL_GetMouseStatefio função segura?

E, no exemplo de SDL_GetMouseState, o SDL_PumpEvents, que é conhecido por ser thread-inseguro, é usado. Se SDL_GetMouseStateé thread-safe, eu tenho que usar SDL_PumpEventso que é thread-inseguro com ele para torná-lo funcionando corretamente?

Publicado 25/01/2016 em 20:20
usuário
Em outras línguas...                            


1 respostas

votos
1

O código desta função é:

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

E SDL_GetMouseapenas retorna endereço da variável global estática. Por isso, não há nada inseguro com ele, mas não há atomicidade.

No entanto os eventos são processados separadamente. Se você não prcess eventos, a estrutura do mouse não atualizar e SDL_GetMouseStateirá dar-lhe valores desatualizados. Documentação afirma explicitamente que você deve chamar SDL_PumpEventsapenas no segmento de gráficos (o que inicializado sistema de gráficos).

Pior cenário é você que lê vales da SDL_GetMouseStateenquanto outra thread atualiza-lo. Você pode ler o valor antigo, novo valor, ou mesmo uma mistura de dois (por exemplo x de novo, mas y de idade).

Respondeu 26/01/2016 em 02:18
fonte usuário

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