2015-05-12 4 views
-2

Я написал программу на C++, которая должна отображать изображение (с SDL), затем ждет 10 секунд и загружает следующее изображение. Когда я использую Sleep(10000), программа зависает и не реагирует. Когда я использую что-то вроде:C++ wait without freezing

void Wait (short Seconds) 
{ 
    clock_t WaitTime = clock() + Seconds * CLOCKS_PER_SEC; 
    while(clock() < WaitTime) 
    { 

    } 
} 

происходит то же самое. Есть ли возможность просто ждать 10 секунд без замораживания окна?

+1

Возможно использовать таймер? http://wiki.libsdl.org/SDL_AddTimer –

+0

Это слишком широкое, потому что вам нужно узнать, как работает планирование (и, возможно, потоки)! Прямо сейчас вы просто заняты, ожидая, что это очень наивная и очень сильная голодная операция. –

ответ

1

Используйте timer и не качают очереди сообщений с помощью SDL_WaitEvents() до костров таймера:

#include <SDL2/SDL.h> 
#include <iostream> 

void MySleep(Uint32 interval) 
{ 
    struct Container 
    { 
     static Uint32 TimerCallback(Uint32 interval, void* param) 
     { 
      SDL_Event event; 
      event.type = SDL_USEREVENT; 
      event.user.code = 42; 
      SDL_PushEvent(&event); 
      return 0; 
     } 
    }; 

    SDL_AddTimer(interval, Container::TimerCallback, NULL); 

    SDL_Event event; 
    while(SDL_WaitEvent(&event)) 
    { 
     if(event.type == SDL_USEREVENT && event.user.code == 42) 
      break; 
    } 
} 

int main(int argc, char** argv) 
{ 
    SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO); 

    SDL_Window* window = SDL_CreateWindow 
     ( 
     "SDL2",  
     SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 
     640, 480,      
     SDL_WINDOW_SHOWN   
     ); 

    MySleep(10000); 

    SDL_DestroyWindow(window); 

    SDL_Quit(); 
    return 0; 
} 

В зависимости от того, что вы имеете в виду под «не реагирует», возможно, придется добавить userevent проверку к вашему главному событию вместо этого.