线程查询 SDL_Net
Thread query SDL_Net
运行 我在单独线程中的监听函数似乎用掉了很多 CPU
使用延迟来减少 cpu 使用是否被认为是可以的,还是我使用线程完全错误?
// Running in a seperate Thread
void Server::listen()
{
while (m_running)
{
if (SDLNet_UDP_Recv(m_socket, m_packet) > 0)
{
//Handle Packet Function
}
}
}
来自the SDLNet_UDP_Recv
reference
This is a non-blocking call, meaning if there's no data ready to be received the function will return.
这意味着如果没有接收到任何东西,那么 SDLNet_UDP_Recv
将 return 立即与 0
并且你的循环将迭代并再次调用 SDLNet_UDP_Recv
return s 0
等等。这个循环永远不会暂停,所以它当然会尽可能多地使用 CPU。
一个可能的解决方案确实是在循环中添加某种延迟或休眠。
我会建议类似
while (m_running)
{
int res;
while (m_running && (res = SDLNet_UDP_Recv(...)) > 0)
{
// Handle message
}
if (res < 0)
{
// Handle error
}
else if (m_running /* && res == 0 */)
{
// Small delay or sleep
}
}
运行 我在单独线程中的监听函数似乎用掉了很多 CPU 使用延迟来减少 cpu 使用是否被认为是可以的,还是我使用线程完全错误?
// Running in a seperate Thread
void Server::listen()
{
while (m_running)
{
if (SDLNet_UDP_Recv(m_socket, m_packet) > 0)
{
//Handle Packet Function
}
}
}
来自the SDLNet_UDP_Recv
reference
This is a non-blocking call, meaning if there's no data ready to be received the function will return.
这意味着如果没有接收到任何东西,那么 SDLNet_UDP_Recv
将 return 立即与 0
并且你的循环将迭代并再次调用 SDLNet_UDP_Recv
return s 0
等等。这个循环永远不会暂停,所以它当然会尽可能多地使用 CPU。
一个可能的解决方案确实是在循环中添加某种延迟或休眠。
我会建议类似
while (m_running)
{
int res;
while (m_running && (res = SDLNet_UDP_Recv(...)) > 0)
{
// Handle message
}
if (res < 0)
{
// Handle error
}
else if (m_running /* && res == 0 */)
{
// Small delay or sleep
}
}