我正在做关于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。自从我成功关闭它以来,没有“主”线程,这些线程会阻止程序正常关闭。除此之外,它使我对问题没有任何了解。