在套接字接收阻塞等待数据时保持 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 系统特有的。有关其他系统上的类似解决方案,请参阅 。
我有一个生成 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 系统特有的。有关其他系统上的类似解决方案,请参阅