SDL2: Является ли SDL_GetMouseState () поточно-?

голоса
34

Является ли SDL_GetMouseStateфункция поточно?

А в примере SDL_GetMouseState, то SDL_PumpEvents, что , как известно, поточно-небезопасным, используется. Если SDL_GetMouseStateпотокобезопасно, я должен использовать SDL_PumpEventsчто-нить небезопасно с ним , чтобы сделать это правильно работать?

Задан 25/01/2016 в 20:20
пользователем
На других языках...                            


1 ответов

голоса
1

Код этой функции:

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

И SDL_GetMouseтолько возвращает адрес статической глобальной переменной. Следовательно, нет ничего небезопасным с ним, но нет атомарности.

Однако события обрабатываются отдельно. Если вы не prcess события, структура мыши не будет обновлять и SDL_GetMouseStateдаст вам устаревшие значения. Документация прямо говорится , вы должны называть SDL_PumpEventsтолько в графическом потоке (тот , что инициированный графическую систему).

В худшем случае это вы читаете VALES от в SDL_GetMouseStateто время как другой поток обновляет его. Вы можете прочитать старое значение, новое значение, или даже сочетание двух (например , х от нового , но у от старого).

Ответил 26/01/2016 в 02:18
источник пользователем

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