返回0后程序仍在运行;使用SDL_Renderer

时间:2019-03-19 18:16:11

标签: c++ sdl

我正在做关于SDL的Lazy Foo教程(我正在使用SDL2-2.0.9),在纹理渲染部分遇到了以下问题:程序按预期方式编译并运行,这里没有问题,但是当我关闭了窗口,控制台没有关闭,并且进程继续运行,因此我必须单独关闭控制台。

当我尝试调试它时,我发现程序确实离开了主循环并成功到达了主函数中的“ return 0”行,但随后它一直挂着,直到关闭控制台为止。

仅当我将SDL渲染器与SDL_RENDERER_SOFTWARE以外的任何其他选项一起使用时,才会出现此问题。如果我使用SDL_RENDERER_SOFTWARE-程序将按预期关闭。使用其他选项时,它将在运行其他线程(crypt32.dll,ntdll.dll和nvd3dum,在线程视图中按此顺序排列)的位置保持“返回0”,这意味着该进程被卡在crypt32中。

我知道我的主要功能不是“真正的主要”,因为它已被SDL劫持,因此exit(0)可以作为临时解决方案很好地工作。但是我想知道,为什么会这样呢?还有其他方法可以解决此问题,这样我就不必使用exit(0)了?

这是一个示例(简化)代码,它为我演示了此问题:

#include "SDL.h"
#include <stdio.h>

int main(int argc, char *argv[]) {
    SDL_Window *win = NULL;
    SDL_Renderer *renderer = NULL;
    SDL_Texture *bitmapTex = NULL;
    SDL_Surface *bitmapSurface = NULL;
    int width = 640, height = 480;

    if (SDL_Init(SDL_INIT_VIDEO) < 0)
    {
        printf("Could not initialize SDL");
        return 1;
    }

    win = SDL_CreateWindow("Hello World", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, 0);

    renderer = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED);
    bitmapSurface = SDL_LoadBMP("res/x.bmp");
    bitmapTex = SDL_CreateTextureFromSurface(renderer, bitmapSurface);
    SDL_FreeSurface(bitmapSurface);

    bool quit = false;
    while (!quit) {
        SDL_Event e;
        while (SDL_PollEvent(&e) != 0) {
            if (e.type == SDL_QUIT) {
                quit = true;
            }
        }

        SDL_RenderClear(renderer);
        SDL_RenderCopy(renderer, bitmapTex, NULL, NULL);
        SDL_RenderPresent(renderer);
    }

    SDL_DestroyTexture(bitmapTex);
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(win);

    SDL_Quit();

    printf("REACHED RETURN 0");
    return 0;

}

按预期工作,但是关闭窗口后,我看到控制台中打印了“ REACHED RETURN 0”,仅此而已,控制台停留在那里。该代码可以进一步简化,只要创建了SDL_Renderer实例,该问题就会出现。

UPD:挂起期间的调用栈:

>   ntdll.dll!_NtWaitForMultipleObjects@20()    
    KernelBase.dll!_WaitForMultipleObjectsEx@20()   
    crypt32.dll!ILS_WaitForThreadProc() 
    kernel32.dll!@BaseThreadInitThunk@12()  
    ntdll.dll!__RtlUserThreadStart()    
    ntdll.dll!__RtlUserThreadStart@8()  

UPD2:问题根本不在于循环,我创建了最简单的应用程序,在该应用程序中,我只创建了一个窗口和一个渲染器,然后返回0,它仍然给了我一个悬挂的控制台。像这样:

#include <SDL.h>

int main(int argc, char* args[])
{
    if (SDL_Init(SDL_INIT_VIDEO) < 0) return 1;
    SDL_Window* window = SDL_CreateWindow("Test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0);
    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    return 0;
}

我正确销毁它们时也是如此。问题出在渲染器中。

UPD3:这是“挂起”期间的Parallel Stack window。自从我成功关闭它以来,没有“主”线程,这些线程会阻止程序正常关闭。除此之外,它使我对问题没有任何了解。

0 个答案:

没有答案