2017-02-18 62 views
0

运行我听功能在一个单独的线程似乎是它认为确定使用延迟时间以减少CPU使用率占用大量CPU 的还是我使用线程都错了?线程查询SDL_Net

// Running in a seperate Thread 
void Server::listen() 
{ 
    while (m_running) 
    { 
     if (SDLNet_UDP_Recv(m_socket, m_packet) > 0) 
     { 
       //Handle Packet Function 
     } 
    } 
} 
+0

是插座非阻塞插座? –

+0

此外,请记住['SDLNet_UDP_Recv'](http://sdl.beuc.net/sdl.wiki/SDLNet_UDP_Recv)返回'-1' *误差*,这是非零的,并因此如此。您需要例如'如果(SDLNet_UDP_Recv(...)> 0)' –

+0

我99%肯定他们阻止。我也有> 0,我只是快速输出一个最小的例子。抱歉的错误。 – user3220058

回答

0

the SDLNet_UDP_Recv reference

这是一个非阻塞调用,这意味着如果没有数据准备接收函数将返回。

这意味着,如果没有什么接收,然后SDLNet_UDP_Recv0立即返回,你的循环将迭代,并再次调用SDLNet_UDP_Recv返回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 
    } 
} 
+0

谢谢,我的主要问题是如果使用SDL_Delay是一个有效的解决方案。对不起,不阻挡也。今天没有。 – user3220058