C ++等待没有冻结

时间:2015-05-12 23:48:53

标签: c++ sdl

我在C ++中编写了一个应该显示图片的程序(使用SDL),然后等待10秒并加载下一张图片。 当我使用Sleep(10000)程序冻结并且没有反应时。 当我使用类似的东西时:

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

  }
}

同样的事情发生了。是否有可能在没有窗户冻结的情况下等待10秒钟?

1 个答案:

答案 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检查添加到主事件循环中。