SDL C++ 问题(处于等待状态的窗口)

Posted

技术标签:

【中文标题】SDL C++ 问题(处于等待状态的窗口)【英文标题】:SDL C++ Issues (Window in wait status) 【发布时间】:2012-12-10 21:02:29 【问题描述】:

我正在使用 SDL 和 OpenGL,我创建了 SDL_Surface 和 SDL_SetVideoMode:

SDL_Init(SDL_INIT_EVERYTHING);

const SDL_VideoInfo * dinfo = SDL_GetVideoInfo();

// Setup the surface of SDL
if(configurer::fullscreened)
    data::Wnd_Surface = SDL_SetVideoMode(configurer::window_width,configurer::window_height,dinfo->vfmt->BitsPerPixel,SDL_FULLSCREEN | SDL_OPENGL);
else
    data::Wnd_Surface = SDL_SetVideoMode(configurer::window_width,configurer::window_height,16,SDL_OPENGL);

if(data::Wnd_Surface==0)
    return -1;


SDL_WM_SetCaption("Test", "Test");

SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

// Initialize GLEW
if(glewInit()!=0)
    cout << "Failed to start glew";
    return -1;

我在我的主函数中初始化它,然后我有以下(在主函数上):

while(!data::terminate)
    AscMainLoop();
    SDL_Delay(80);

return 0;

一切都好。我的 AscMainLoop 函数:

int timerelapse = SDL_GetTicks();
//Check for key events
    /* BLA BLA BLA *(
AscUpdateComponents(); // Update matrixes and bla bla bla...
AscRender();// Paint

// Fps Counter Update
    /* BLA BLA BLA */

SDL_GL_SwapBuffers();// Swap the buffers of our screen

好的,我遇到了一个问题,我运行了应用程序,但屏幕没有响应,我认为问题在于 main 上的 while 循环。 窗口打开,但我不能拖动它,调整它的大小,这就像窗口上的等待状态(Windows 7 有趣的“请等待”光标)激活。 我已经尝试将主循环放在一个线程中。不知道怎么回事……

编辑:就像主函数循环导致的冻结状态

【问题讨论】:

你为什么打电话给SDL_GL_SetAttribute() 之后 SDL_SetVideoMode() 我已经解决了,问题仍然存在。 您确定您的“检查关键事件”部分不是无限循环吗? 其实例子中的代码我写错了,是/* BLA BLA BLA */ 呵呵,那个代码是AscMainLoop函数,在main的while循环中调用,是无限循环,因为它需要更新 SDL Surface (SDL_GL_SwapBuffers()) 并使用 openGL 绘制对象。它应该是一个无限循环,就像我说的,我已经在一个线程中尝试过...... 您可能想自学使用调试器。 【参考方案1】:

您需要在whileAscMainLoop 中处理您的SDL_Events,方法是:

SDL_Event Event;

while(SDL_PollEvent(&Event))

    // Later, you'll be adding your code that handles keyboard / mouse input here

【讨论】:

非常感谢!我不知道,真的有必要吗?为什么? 虽然没有记录在案,但我假设在 Windows 上它还充当为您的窗口处理消息的WndProc 这就是精神!做一些很棒的事情!如果您还有其他问题,请随时询问 令人着迷的是(至少在 Windows 中),您实际上可以在单独的线程中拥有 SDL_PollEvent,只要该线程是最初调用 SDL_Init 的线程。 FWIW。

以上是关于SDL C++ 问题(处于等待状态的窗口)的主要内容,如果未能解决你的问题,请参考以下文章

创建网格和启动窗口 SDL/GLEW C++ 时访问冲突

OpenGL 不绘制到 SDL2 窗口

使用 OpenGL 和 SDL 处理窗口大小调整

检查窗口是不是处于活动状态

OpenGL 闪烁/损坏,窗口调整大小和 DWM 处于活动状态

C++ ld 返回 1 个退出状态