在套接字接收阻塞等待数据时保持 window 动作和关闭动作?

Maintain window motion and close actions while socket recv is blocking awaiting data?

我有一个生成 SDL_window 的 SDL2 c++ 程序,同时还使用了一个通过 recv 接收数据的套接字服务器。我注意到,每当 recv 阻塞并期待数据时,SDL window 操作(如使用鼠标 window 移动,或通过单击角按钮最小化和关闭 window 被禁用。当然,我希望程序功能在 recv 阻塞时被冻结,但我对 window 运动也被冻结感到惊讶,因为我希望这将由 OS 并行处理。我可以做些什么来在接收块时保持 SDL_window 运动?

编辑:

就代码而言,window 是通过调用

创建的
gWindow = SDL_CreateWindow("Program", 0, 55, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN | SDL_WINDOW_ALWAYS_ON_TOP);

在 SDL 初始化调用中。程序循环运行,有SDL事件处理器

SDL_Event e;

用于捕获例如单击以关闭 window

while (SDL_PollEvent(&e) != 0)
            {
                //User requests quit
                if (e.type == SDL_QUIT)
                {
                    quit = true;
                }
            }

我想在 recv 阻塞时禁用此功能是有道理的。我只是想知道是否可以添加一个额外的层来让 OS 接管这项任务,这根本不会出现在我的代码中。

事实证明,我的问题的解决方案只是为 recv 添加 100 毫秒超时

DWORD timeout = 100;// millisecond timeout for receiving data
setsockopt(ClientSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));

然后,如果没有收到数据,我将跳过这段代码中需要 non-trivial 数据的部分

iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
if (iResult == SOCKET_ERROR)
                        {
                            if (WSAGetLastError() == WSAETIMEDOUT) {
                                goto SKIP;
                            }
                        }

现在 recv 不会无限期阻塞,并且所有 window 函数对人类(其反应时间大约为 200 毫秒)保持完整。

请注意,这是 Windows 系统特有的。有关其他系统上的类似解决方案,请参阅