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 |
©2023 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 ©2023 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.