【发布时间】:2020-12-01 14:47:27
【问题描述】:
我有一个生成 SDL_window 的 SDL2 c++ 程序,同时还使用了一个通过 recv 接收数据的套接字服务器。我注意到,每当 recv 阻塞并期待数据时,SDL 窗口操作(例如用鼠标移动窗口,或通过单击角按钮最小化和关闭窗口)都会被禁用。当然,我希望程序功能在 recv 阻塞时被冻结,但我对窗口运动也被冻结感到惊讶,因为我希望这将由操作系统并行处理。有什么办法可以在 recv 阻塞时保留 SDL_window 运动吗?
编辑:
就代码而言,窗口是通过调用来创建的
gWindow = SDL_CreateWindow("Program", 0, 55, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN | SDL_WINDOW_ALWAYS_ON_TOP);
在 SDL 初始化调用中。程序循环运行,有SDL事件处理程序
SDL_Event e;
用于捕获例如点击关闭窗口
while (SDL_PollEvent(&e) != 0)
{
//User requests quit
if (e.type == SDL_QUIT)
{
quit = true;
}
}
我想在 recv 阻塞时禁用此功能是有道理的。我只是想知道是否可以添加一个额外的层来让操作系统接管这个任务,这根本不会出现在我的代码中。
【问题讨论】:
-
展示代码而不是冗长地谈论问题真的很有帮助。我们可以用正确的代码重现问题,但我们不能用这个。
-
您描述的UI窗口操作仍然需要消息处理。因此,您需要将套接字操作移至单独的工作线程,或者使用非阻塞套接字。无论哪种方式都不会阻止您的 UI 线程处理来自操作系统的 UI 消息。
-
这里有一些有用的选项:stackoverflow.com/questions/47146174/…
标签: c++ windows sockets visual-studio-2017 sdl-2