Continuando nossa série de artigos traduzidos do site lazyfoo, veremos agora como executar uma função por uma certa quantidade de tempo.
Nós já trabalhamos com timers no SDL nos artigos anteriores, mas existe também um timer que executa uma função após uma certa quantidade de tempo. Nesse artigo, iremos criar um programa simples que exibe uma mensagem no terminal depois de uma certa quantidade de tempo.
//Our test callback function Uint32 callback( Uint32 interval, void* param );
Quando for criar a função que vai ser chamada, saiba que ela precisa ser declarada de uma forma especifica. VocÊ não pode simplesmente criar qualquer tipo de função e chama-la. A função precisa ter um inteiro de 32 bits como primeiro argumentos, um ponteiro void como segundo argumento, e precisa retornar um inteiro de 32 bits.
Uint32 callback( Uint32 interval, void* param ) { //Print callback message printf( "Callback called back with message: %s\n", (char*)param ); return 0; }
Aqui temos nossa função simples que imprime uma mensagem no terminal após uma certa quantidade de tempo. O argumento interval não é usado aqui, mas é normalmente usado por funções que precisam ser repetidas.
Como ponteiros void podem apontar para qualquer coisa, essa função irá receber uma string e imprimi-lo no terminal.
//Initialize SDL if (SDL_Init( SDL_INIT_VIDEO | SDL_INIT_TIMER ) < 0 ) { printf( "SDL could not initialize! SDL Error: %s\n", SDL_GetError() ); success = false; }
Certifique-se de inicializar SDL_INIT_TIMER para usar timer.
//Set callback SDL_TimerID timerID = SDL_AddTimer( 3 * 1000, callback, "3 seconds waited!" ); //While application is running while( !quit ) { //Handle events on queue while( SDL_PollEvent( &e ) != 0 ) { //User requests quit if( e.type == SDL_QUIT ) { quit = true; } } //Clear screen SDL_SetRenderDrawColor( gRenderer, 0xFF, 0xFF, 0xFF, 0xFF ); SDL_RenderClear( gRenderer ); //Render splash gSplashTexture.render( 0, 0 ); //Update screen SDL_RenderPresent( gRenderer ); } //Remove timer in case the call back was not called SDL_RemoveTimer( timerID );
Nós disparamos nosso timer usando SDL_AddTimer. O primeiro argumento é quanto tempo a chamada irá durar, que nesse case é ajustado para 3000 milisegundos ou 3 segundos. O segundo argumento é a função que será chamada e o último argumento é o ponteiro de dados que iremos enviar.
Essa aplicação irá disparar a chamada da função e então entra no loop principal. Enquanto o loop principal estiver sendo executado a função pode enviar uma mensagem para o terminal. Caso a chamada da função mnão ocorra antes do loop principal terminar, removemos a chamada com SDL_RemoveTimer. Cuidado, a chamada do timer é asincrona, o que significa que pode acontecer quando o programa estiver fazendo alguma outra coisa. Não faça com que a função chamada altere algum dado enquanto a thread principal estiver usando o mesmo dado. Baixe os arquivo de mídia e do código fonte desse artigo aqui.