C++ 为什么mac os sdl2程序窗口没有响应?

C++ 为什么mac os sdl2程序窗口没有响应?,c++,sdl,C++,Sdl,我刚刚在mac上设置了SDL2框架,但是无论编译和运行程序如何成功,窗口都没有响应(我复制了创建矩形的代码) 我使用xcode,并从这里开始学习教程 一步一步 SDL_Window* window = NULL; //The surface contained by the window SDL_Surface* screenSurface = NULL; //Initialize SDL if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) { print

我刚刚在mac上设置了SDL2框架,但是无论编译和运行程序如何成功,窗口都没有响应(我复制了创建矩形的代码)

我使用xcode,并从这里开始学习教程 一步一步

SDL_Window* window = NULL;

//The surface contained by the window
SDL_Surface* screenSurface = NULL;

//Initialize SDL
if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
    printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
}
else
{
    //Create window
    window = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
    if( window == NULL )
    {
        printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
    }
    else
    {
        //Get window surface
        screenSurface = SDL_GetWindowSurface( window );

        //Fill the surface white
        SDL_FillRect( screenSurface, NULL, SDL_MapRGB( screenSurface->format, 0xFF, 0xFF, 0xFF ) );

        //Update the surface
        SDL_UpdateWindowSurface( window );
        cout << " Ok" << endl;
        //Wait two seconds
        SDL_Delay( 20000 );
    }
}

//Destroy window
SDL_DestroyWindow( window );

//Quit SDL subsystems
SDL_Quit();

return 0;
SDL_Window*Window=NULL;
//窗户所包含的表面
SDL_表面*屏幕表面=空;
//初始化SDL
if(SDL_Init(SDL_Init_视频)<0)
{
printf(“SDL无法初始化!SDL_错误:%s\n”,SDL_GetError());
}
其他的
{
//创建窗口
window=SDL\u CreateWindow(“SDL教程”,SDL\u WINDOWPOS\u未定义,SDL\u WINDOWPOS\u未定义,屏幕宽度,屏幕高度,显示SDL\u窗口);
如果(窗口==NULL)
{
printf(“无法创建窗口!SDL_错误:%s\n”,SDL_GetError());
}
其他的
{
//获取窗口表面
屏幕表面=SDL_GetWindowSurface(窗口);
//把表面涂成白色
SDL_FillRect(屏幕表面,NULL,SDL_映射RGB(屏幕表面->格式,0xFF,0xFF,0xFF));
//更新曲面
SDL_更新内表面(窗口);

cout为了让编写SDL的程序“响应”操作系统,您应该将控制权交还给SDL,让它处理系统消息,并将它们作为SDL事件(鼠标事件、键盘事件等)返回给您

要做到这一点,您必须添加一个使用
SDL\u polleevent
的循环,该循环应该看起来很有用

while(true)
{
    SDL_Event e;
    while (SDL_PollEvent(&e)) 
    {
        // Decide what to do with events here
    }

    // Put the code that is executed every "frame". 
    // Under "frame" I mean any logic that is run every time there is no app events to process       
}
您需要处理一些特殊事件,例如
SDL_QuiEvent
,才能关闭应用程序。如果您想处理它,您应该修改代码,使其看起来像这样:

while(true)
{
    SDL_Event e;
    while (SDL_PollEvent(&e)) 
    {
        if(e.type == SDL_QUIT)
        {
            break;
        }
        // Handle events
    }

    // "Frame" logic     
}

SDL_延迟(20000)
是20秒的冻结窗口。您应该添加一个消息循环。是的,我添加了20秒以了解是否一切正常,但当此窗口打开时,有一个铭文显示程序没有响应,但在控制台中一切正常……或者您的意思是它将在20秒内没有响应?程序没有响应nding,因为没有处理操作系统消息和其他内容的消息循环。您应该使用
SDL_polleevent
添加一个循环,如图所示。是的,程序在这20秒内不会响应。