Serwis Edukacyjny
Nauczycieli
w I-LO w Tarnowie

obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

Autor artykułu: mgr Jerzy Wałaszek
Uaktualniono: 31.07.2022

©2022 mgr Jerzy Wałaszek
I LO w Tarnowie

Interfejs SDL2:

SDL_AddTimer

SPIS TREŚCI

Rozdział jest tłumaczeniem oryginalnej instrukcji dla biblioteki SDL2.

SDL_AddTimer

Użyj tej funkcji, aby ustawić funkcję wywoływaną zwrotnie, która będzie wykonywana w oddzielnym wątku po upływie zadanej liczby milisekund.

Składnia

SDL_TimerID SDL_AddTimer(Uint32            interval,
                         SDL_TimerCallback callback,
                         void*             param)

Parametry funkcji

interval opóźnienie dla licznika czasu (ms) przekazywane do funkcji callback
callback funkcja, która zostanie wywołana, gdy upłynie zadany czas; zobacz do Uwag.
param wskaźnik przekazywany do funkcji callback

Wartość zwracana

Zwraca identyfikator licznika czasu lub 0 w przypadku wystąpienia błędu; wywołaj funkcję SDL_GetError(), aby otrzymać więcej informacji.

Przykładowe kody

/* uruchom licznik czasu; poniższa funkcja będzie wykonana po opóźnieniu */

Uint32 delay = (33 / 10) * 10;  /* Aby zaokrąglić w dół do najbliższych 10 ms */
SDL_TimerID my_timer_id = SDL_AddTimer(delay, my_callbackfunc, my_callback_param);

...

Uint32 my_callbackfunc(Uint32 interval, void *param)
{
    SDL_Event event;
    SDL_UserEvent userevent;

    /* W tym przykładzie nasza funkcja umieszcza zdarzenie SDL_USEREVENT
    w kolejce, co spowoduje jej ponowne wywołanie po tym samym czasie: */

    userevent.type = SDL_USEREVENT;
    userevent.code = 0;
    userevent.data1 = NULL;
    userevent.data2 = NULL;

    event.type = SDL_USEREVENT;
    event.user = userevent;

    SDL_PushEvent(&event);
    return(interval);
}

Zwróć uwagę, że jest możliwe uniknięcie problemów wielowątkowości z licznikami czasu SDL przez wprowadzenie do userevent.data1 adresu funkcji, którą chcesz uruchomić, a do userevent.data2 jej parametrów, a następnie obsłużenie jej w pętli zdarzeń.

/* z takim samym kodem jak poprzednio: */
Uint32 my_callbackfunc(Uint32 interval, void *param)
{
    SDL_Event event;
    SDL_UserEvent userevent;

    /* W tym przykładzie nasza funkcja umieszcza w kolejce funkcję
    i powoduje, że funkcja callback zostanie wywołana ponownie po
    takim samym okresie: */

    userevent.type = SDL_USEREVENT;
    userevent.code = 0;
    userevent.data1 = &my_function;
    userevent.data2 = param;

    event.type = SDL_USEREVENT;
    event.user = userevent;

    SDL_PushEvent(&event);
    return(interval);
}

/* Teraz pętla zdarzeń */
SDL_Event event;
while (SDL_PollEvent (&event))
{
    switch(event.type)
    {
        case SDL_USEREVENT: {
            /* a teraz możemy wywołać funkcję, którą chcieliśmy wywołać w liczniku czasu,
               lecz nie mogliśmy z powodu problemów wielowątkowości */
            void (*p) (void*) = event.user.data1;
            p(event.user.data2);
            break;
        }
        /* ... */
    }
}

Uwagi

Jeśli używasz tej funkcji, musisz przekazać SDL_INIT_TIMER do SDL_Init().

Funkcja callback otrzymuje bieżący okres licznika czasu oraz parametr dostarczony przez użytkownika z wywołania SDL_AddTimer() i zwraca następny okres licznika czasu. Jeśli wartość zwracana z funkcji callback wynosi 0, licznik czasu zostaje wyłączony.

Funkcja callback jest uruchamiana w osobnym wątku. Zobacz na podane powyżej przykłady, gdzie znajdziesz sposób przetwarzania wywołań zwrotnych z licznika czasu w głównym wątku aplikacji, jeśli jest to pożądane.

Powiązane funkcje

Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2022 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.