|
Serwis Edukacyjny Nauczycieli w I-LO w Tarnowie
Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy
Wałaszek |
©2026 mgr Jerzy Wałaszek
|
SDL_AddTimer
| SPIS TREŚCI |
Rozdział jest tłumaczeniem oryginalnej instrukcji dla biblioteki SDL2.
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.
SDL_TimerID SDL_AddTimer(Uint32 interval,
SDL_TimerCallback callback,
void* param)
|
| 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 |
/* 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;
}
/* ... */
}
}
|
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.
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2026 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:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.