2017-02-18 69 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